2010-05-25 106 views
2

如果我的機器上有X個內核,並且啓動X個線程。讓我們假設爲了爭論,每個線程在它使用的內存,硬盤等方面是完全分離的。操作系統會知道將每個線程發送到一個核心,或者在多個線程的一個核心上進行更多時間切片。 問題歸結爲,如果我有X核心,並且我的程序必須執行獨立計算,我應該啓動X個線程,每個線程是否都通過管道連接到核心,或者是因爲我有X個核心可以啓動X線程完全錯誤?我在想。 這是用C# -線程和內核

+1

Duplicate:http://stackoverflow.com/questions/32343/how-do-i-spawn-threads-on-different-cpu-cores。 而且,通過在自己的內核上運行每個線程,您不一定會獲得更好的性能,因爲您不知道其他內核正在做什麼(操作系統知道)。 – Seth 2010-05-25 20:01:43

+0

我認爲這個想法是爲每一個可以獨立運行的業務創建一個線程。計算機如何以及爲何決定運行線程的核心取決於各種事情,我建議您不要試圖微觀管理。 – overslacked 2010-05-25 20:03:29

回答

2

我會說沒有...

的.NET團隊推出了TPL明確委託線程執行利用多個內核。 Windows Vista沒有太多內置的智能來支持將線程委託給多個內核的操作系統。考慮到Windows 7對多核心的支持得到了很大的改善,我不驚奇地發現.NET框架(4.0)中的這種改進。

0

我想這可能取決於平臺和操作系統。根據我的經驗,在Linux上使用C++控制檯應用程序時,如果需要從機器中儘可能多地獲得性能,則在X內核上使用X線程是正確的。但是請注意,任何併發任務(包括GUI)都會佔用您的程序可用的CPU時間。但是在沒有GUI的專用服務器上,我的每個內核都使用99-100%的專用程序。

0

由於C#使用本機線程,我覺得我可以評論,即使我的經驗主要是Java(在Windows上)。一般來說,操作系統會嘗試平衡負載,所以如果你在一個線程上最大化了一個計算密集型任務的核心,那麼就會在該核心上安排很少的線程。

我最近編寫了一些使用任務框架的cpu密集型多線程代碼,其中工作分解爲小任務並饋送到N個隊列。每個隊列都由一個線程擁有。由於我從1..X增加了線程數,其中X是核心數,所以線速度提高了。

所以一般來說,答案是肯定的,你可以期待操作系統做正確的事情,特別是隨着線程數量的增加和接近核心數量的增加。

2

這完全取決於每個線程要做多少工作。如果您要在4核機器上啓動4個線程,並且只是運行一個緊密循環,那麼它很可能會佔用CPU總時間的100%。

論是否更廣泛的問題,給出ķ線程和ķ內核,操作系統將自動安排每個線程0->ķ -1在芯0->ķ -1,則這不能得到保證。一般來說,一旦某個線程即將安排運行,它將被分配給下一個可用的CPU。但是,我相信,操作系統將是智能的,並且會嘗試重用先前線程所運行的相同內核,因爲線程本地數據可能會緩存在該內核上。然而,這就是說,在當今共享處理器緩存的世界中,這不會是良好線程調度的先決條件。

通過調用SetProcessorAffinity()方法,可以影響給定內核的線程親和力。不過,我傾向於避免這樣做,因爲操作系統通常很擅長讓你的線程正確。

注意

有跨越多個線程非一致內存訪問,這將導致線程阻塞對方即使沒有參與鎖定一些有趣的問題。

假設您有大量的值,並且您希望n線程對它們進行操作。您必須確保每個線程都訪問單獨緩存行上的數據,以訪問其他線程訪問的數據 - 這是一個低級問題,並不是.Net程序員(但是那些在C++或更低級別平臺上長大的人)所使用的問題來處理。

該問題在MSDN雜誌的this article中得到了很好的展示。它使迷人的閱讀。

0

通常由操作系統調度程序將任務分配給正在執行的內核。 設N是要運行的任務的數量,X是執行內核的數量。

如果N < X除非您有其他任務正在運行,否則您的機器資源將無法完全使用。 如果N> = X,它是OS對所有可用內核之間的線程進行負載平衡的「最佳意圖」。 實際上,您不能保證所有任務都將在單獨的核心上運行,除非您在每個任務線程上強制執行關聯。 事實上,如果您的舊操作系統不理解SMT處理器,它將會被愚弄,並且可以爲每個單核分配多個任務,而其他內核可能會空閒。