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

相关文章

最近看了一下学习资料,感觉进制转换其实还是挺有意思的,尤...
/*HashSet 基本操作 * --set:元素是无序的,存入和取出顺序不...
/*list 基本操作 * * List a=new List(); * 增 * a.add(inde...
/* * 内部类 * */ 1 class OutClass{ 2 //定义外部类的成员变...
集合的操作Iterator、Collection、Set和HashSet关系Iterator...
接口中常量的修饰关键字:public,static,final(常量)函数...