说我运行像下面的一个简单的单线程进程:为什么单个线程进程在多个处理器/内核上执行?
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个内核最大化,但只有当我将进程的关联性设置为单个内核时才会发生这种情况。
为什么工作量分成单独的核心上?不会将工作负载分解为几个内核与缓存混淆或导致其他性能处罚?
这是否是为了防止一个核心过热的简单原因?还是有更深层的原因?
编辑:我知道操作系统负责调度,但我想知道为什么它“困扰”。当然,从天真的角度来看,坚持一个(主要是*)单线程进程到1核心是更简单的更有效的方式去?
*我说的大多是单线程的,因为这里有多个theads,但其中只有2做任何事情:
小鸡蛋里挑骨头的参数;说这是一个单线程的过程将是不正确的。 JVM在内部产生多个线程,用于终结器,垃圾收集器等内务处理目的。很有可能每个线程完成真正的工作,JVM线程被映射到真正的h/w线程,这又可能解释传播。 –
我想Caspar意味着_non-daemon_线程。 – Santosh
@ SanjayT.Sharma是的,我简化了一点,可能应该给一个非托管语言的示例程序;)然而就像我说的,我强烈怀疑这不是JVM这样做(如果它映射JVM - >硬件线程,这是负责任的,为什么映射不断变化?) – Caspar