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

相關問題