2013-02-20 82 views
1

線程一旦啓動,總是運行在同一個CPU上,直到它終止爲止?或者它是OS /實施依賴?線程是否始終運行在同一個內核上?

我出於好奇問這個。

+0

如果只有一個CPU核心,是的。對於多核機器來說,答案是「通常不是」(核心之間的線程遷移是可能的),但OS /實現依賴於此。在某些OS/libs/pthreads中有「setaffinity」調用來將某些線程綁定到可用CPU核心的某個子集。 – osgx 2013-02-20 12:39:07

+0

簡短回答:不,線程將按計劃程序認爲合適的方式跳轉核心。如果您對這些細節感到好奇(至少對於Windows),您可能需要查看[Windows Internals第6版](http://www.amazon.com/dp/0735648735)(ISBN:978-0735648739)。第5章的一半致力於深入解釋線程調度。 – 2013-02-20 12:39:20

回答

2

一般來說,在多核心盒子上,沒有。如果可以使用相同的內核,那麼利用仍在L1緩存中的數據可能會獲得優勢(由其他人發佈),但是明確強制內核關聯的缺點是不好的:

線程X是創建並綁定到核心0. 線程X運行。 系統調用的線程X塊,可能用於I/O或線程間通信。 操作系統在內核0上運行線程Y. 線程X在內核1,2和3空閒時準備就緒。

現在呢?

不必要地搶佔線程Y?移動Y的開銷,以及如果Y也綁定到核心0,那該怎麼辦? 再次阻止X直到Y塊?防止X在可以做時取得進展。

2

它依賴於操作系統, 然而,一般來說,操作系統試圖讓線程在相同的內核上運行,因爲線程所使​​用的數據在內核中被緩存的可能性更高,從而提高了性能。

它都基於線程調度機制。

相關問題