2012-03-01 46 views
7

可能重複/單Java線程:
Would a multithreaded Java application exploit a multi-core machine very well?雙核CPU利用率W¯¯運行

我有我的雙核機上運行這樣一個簡單明瞭的Java線程( Windows XP 32位環境)

public static void main(String[] strs) { 

    long j = 0; 
    for(long i = 0; i<Long.MAX_VALUE; i++) 
     j++; 

    System.out.println(j); 
    } 

我的期望是,它會堅持一個單一的CP U充分利用高速緩存(因爲在循環中我們繼續使用局部變量j進行操作,因此一個CPU實用程序將是100%,另一個會非常閒置。 令人驚奇的是,線程啓動後,兩個CPU的利用率都在40%〜60%左右,而一個CPU的利用率略高於另一個CPU。

我的問題是,是否有任何操作系統的負載平衡機制,當失衡已被檢測到踢?在我的情況下,Windows操作系統可能發現一個CPU接近100%,另一個幾乎空閒,因此它會定期將該線程重新安排到另一個CPU。

enter image description here

#EDIT1 我找到了一個可能的解釋: http://siber.cankaya.edu.tr/ozdogan/OperatingSystems/ceng328/node130.html

+0

是,該操作系統將圍繞反彈線程。 – Mysticial 2012-03-01 02:40:47

+0

我認爲這個問題已經回答 http://stackoverflow.com/questions/1649402/would-a-multithreaded-java-application-exploit-a-multi-core-machine-very-well – parion 2012-03-01 02:44:40

+0

並意識到,大多數Java程序都會嘗試使用一個核心,並保留一個核心,就像我在Minecraft中發現的那樣。這裏是誰發現了這一點與他的新電腦http://mlee888.wordpress.com/2006/03/31/java-performance-in-dual-coremultiprocessor-environment/ – parion 2012-03-01 02:47:06

回答

3

當OS執行線程,它運行的一段時間每個線程(比如10-20ms),然後保存線程的狀態,並尋找其他線程跑步。

現在,儘管您可能會考慮CPU利用率圖表,但操作系統實際上比您的程序運行的線程多得多。有線程運行UI循環,等待I/O的線程,運行後臺服務的線程等。大多數線程花費大部分時間阻塞等待某事。

我說這個的原因是從操作系統的角度來解釋,這種情況比看起來更復雜。有一大堆線程在做很多事情,而操作系統正試圖在它們之間切換。假設你想實現一個啓發式,即如果一個線程最後一次用完了整個量子,那麼操作系統將會努力將其調度到同一個核心。操作系統需要跟蹤和考慮更多信息,優化的成功可能取決於很多難以預測的因素。

此外,affinitizing一個線程核心的優勢在實踐中往往可以忽略不計,所以操作系統不會嘗試自動做到這一點。相反,他們公開了一個特性,允許開發人員明確地聲明特定的線程應該與核心關聯,然後操作系統會尊重該決定。

這似乎是一個合理的權衡:如果在關聯到一個核心的線程執行得更好,只是要求OS做到這一點。但是,操作系統不會費心嘗試爲您解決問題。

1

至於你提到的操作系統將圍繞反彈線程。以下本機代碼也如您所描述的那樣工作。

int main(int argc, char** argv) 
{ 
    while(true); 
    return 0; 
} 

如果你看一下這個過程中,它是不斷在25%(使用四核),但Windows 7的資源監視器表示沒有4個核心的是在恆定100%,儘管核心0的使用率高於其他使用者。

cpu may share核心之間的緩存,所以這種行爲並不意味着緩存沒有被使用。

+1

是否有任何官方/文檔說明爲什麼以及操作系統如何反彈? – njzhxf 2012-03-01 04:19:35

+0

@njzhxf - 這有什麼關係嗎? – 2012-03-01 05:15:22

+0

@StephenC想更多地瞭解它 – njzhxf 2012-03-01 06:26:20