微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

java – 为什么单个线程进程在多个处理器/内核上执行?

说我运行一个简单的单线程进程,如下所示:
public class SirCountALot {
    public static void main(String[] args) {
        int count = 0;
        while (true) {
            count++;
        }
    }
}

(这是Java,因为这是我熟悉的,但我怀疑它没有什么重要)

我有一个i7处理器(4个核心或8个计数超线程),而我正在运行Windows 7 64位,所以我启动了Sysinternals Process Explorer来查看cpu的使用情况,正如预期的那样,我看到它正在使用大约20%的所有可用cpu.

但是当我切换选项以显示每个cpu 1个图形时,我看到,使用4“内核”中的1个,cpu的使用量遍布核心:

相反,我期望的是1个核心的最大值,但这只有当我将进程的亲和力设置为单个核心时才会发生.

为什么工作量分散在单独的内核上?不会将多个内核的工作负载分散在一起,会导致缓存或其他性能损失?

这是为了防止一个核心过热的简单原因吗?还是有更深层次的原因?

编辑:我知道操作系统负责安排,但是我想知道为什么它会“麻烦”.从一个天真的观点来看,将(大部分*)单线程进程粘在一个核心上是比较简单的更有效的方式去吗?

*我主要说单线程,因为这里有多个,但只有2个人在做任何事情:

解决方法

操作系统负责安排.可以自动停止线程并在另一个cpu上重新启动它.即使没有其他机器在做,它也会这样做.

该过程在cpu周围移动,因为操作系统不认为每次都有理由继续在同一个cpu上运行线程.

为此,我已经写了一个锁定线程库到一个cpu,所以它不会移动,不会被其他线程中断.这样可以减少延迟并提高吞吐量,但会为该线程浪费cpu.这适用于Linux,也许您可​​以适应Windows. https://github.com/peter-lawrey/Java-Thread-Affinity/wiki/Getting-started

原文地址:https://www.jb51.cc/java/126471.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐