10

说我运行像下面的一个简单的单线程进程:为什么单个线程进程在多个处理器/内核上执行?

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。

Graph showing 20% CPU usage across all cores

但是当我切换选项,以显示每CPU 1个图中,我看到正在使用的4“核”的,而不是1,CPU使用率是遍布核心:

Graph showing erratic CPU usage on each core totaling around 20% usage

相反,我期望的是1个内核最大化,但只有当我将进程的关联性设置为单个内核时才会发生这种情况。

Graph showing most of recent CPU usage to be confined to first core

为什么工作量分成单独的核心上?不会将工作负载分解为几个内核与缓存混淆或导致其他性能处罚?

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

编辑:我知道操作系统负责调度,但我想知道为什么它“困扰”。当然,从天真的角度来看,坚持一个(主要是*)单线程进程到1核心是更简单的更有效的方式去?

*我说的大多是单线程的,因为这里有多个theads,但其中只有2做任何事情:

Screenshot showing number of threads from Eclipse Screenshot showing number of threads in Process Explorer process properties

+2

小鸡蛋里挑骨头的参数;说这是一个单线程的过程将是不正确的。 JVM在内部产生多个线程,用于终结器,垃圾收集器等内务处理目的。很有可能每个线程完成真正的工作,JVM线程被映射到真正的h/w线程,这又可能解释传播。 –

+0

我想Caspar意味着_non-daemon_线程。 – Santosh

+0

@ SanjayT.Sharma是的,我简化了一点,可能应该给一个非托管语言的示例程序;)然而就像我说的,我强烈怀疑这不是JVM这样做(如果它映射JVM - >硬件线程,这是负责任的,为什么映射不断变化?) – Caspar

回答

17

操作系统负责调度。可以自由停止线程并在另一个CPU上重新启动线程。即使机器没有其他任何东西,它也会这样做。

该进程围绕CPU移动,因为操作系统不认为每次都有任何理由继续在同一CPU上运行该线程。

因为这个原因,我写了一个锁线程库到CPU,所以它不会四处移动,不会被其他线程中断。这样可以减少延迟并提高吞吐量,但是会为该线程增加一个CPU。这适用于Linux,也许你可以适应Windows。 https://github.com/peter-lawrey/Java-Thread-Affinity/wiki/Getting-started

+0

它每秒中断一个进程多次。 (在Linux上为100/s)要记住进程上次运行的位置,并尝试将该CPU分配给其他任何CPU,而将其分配给下一个空闲CPU,则需要做更多工作。 –

+0

我想我不够清楚;我知道操作系统会执行计划,并且您可以在第二个图表中看到我为进程设置了亲和力,因此它只使用第一个核心。我想知道的是*为什么操作系统在所有可用内核上安排单个“活动”线程? – Caspar

+0

相反的问题是,为什么要继续将线程分配回同一个CPU,而不是将其分配给下一个空闲CPU(这就是它的作用)。无论有多少CPU忙,使用循环法都能很好地工作。每次分配给同一个CPU可能会导致一个CPU非常繁忙(在其上运行两个线程),而其他CPU空闲。 –

1

我也希望这能很好地对CPU和操作系统的目的做是为了尝试和传播CPU芯片上的热负荷...

所以它会旋转(独特/单)从核心到核心的线程。

这固然可以对抗试图打这个太硬(尤其是,在实践中,你经常会被简单地调整/看到更好的改进,提高了应用程序本身反正)

+0

有趣。你知道Windows/Linux肯定会这么做,还是假设? (另外,欢迎使用stackoverflow:) – Leeor

+0

我已经在OSX和Windows上看到了这一点。我希望Linux也一样,但从未特别试图验证它。 – Camlin

相关问题