說我運行像下面的一個簡單的單線程進程:爲什麼單個線程進程在多個處理器/內核上執行?
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