如果我的機器上有X個內核,並且啓動X個線程。讓我們假設爲了爭論,每個線程在它使用的內存,硬盤等方面是完全分離的。操作系統會知道將每個線程發送到一個核心,或者在多個線程的一個核心上進行更多時間切片。 問題歸結爲,如果我有X核心,並且我的程序必須執行獨立計算,我應該啓動X個線程,每個線程是否都通過管道連接到核心,或者是因爲我有X個核心可以啓動X線程完全錯誤?我在想。 這是用C# -線程和內核
線程和內核
回答
我會說沒有...
的.NET團隊推出了TPL明確委託線程執行利用多個內核。 Windows Vista沒有太多內置的智能來支持將線程委託給多個內核的操作系統。考慮到Windows 7對多核心的支持得到了很大的改善,我不驚奇地發現.NET框架(4.0)中的這種改進。
我想這可能取決於平臺和操作系統。根據我的經驗,在Linux上使用C++控制檯應用程序時,如果需要從機器中儘可能多地獲得性能,則在X內核上使用X線程是正確的。但是請注意,任何併發任務(包括GUI)都會佔用您的程序可用的CPU時間。但是在沒有GUI的專用服務器上,我的每個內核都使用99-100%的專用程序。
由於C#使用本機線程,我覺得我可以評論,即使我的經驗主要是Java(在Windows上)。一般來說,操作系統會嘗試平衡負載,所以如果你在一個線程上最大化了一個計算密集型任務的核心,那麼就會在該核心上安排很少的線程。
我最近編寫了一些使用任務框架的cpu密集型多線程代碼,其中工作分解爲小任務並饋送到N個隊列。每個隊列都由一個線程擁有。由於我從1..X增加了線程數,其中X是核心數,所以線速度提高了。
所以一般來說,答案是肯定的,你可以期待操作系統做正確的事情,特別是隨着線程數量的增加和接近核心數量的增加。
這完全取決於每個線程要做多少工作。如果您要在4核機器上啓動4個線程,並且只是運行一個緊密循環,那麼它很可能會佔用CPU總時間的100%。
論是否更廣泛的問題,給出ķ線程和ķ內核,操作系統將自動安排每個線程0->ķ -1在芯0->ķ -1,則這不能得到保證。一般來說,一旦某個線程即將安排運行,它將被分配給下一個可用的CPU。但是,我相信,操作系統將是智能的,並且會嘗試重用先前線程所運行的相同內核,因爲線程本地數據可能會緩存在該內核上。然而,這就是說,在當今共享處理器緩存的世界中,這不會是良好線程調度的先決條件。
通過調用SetProcessorAffinity()方法,可以影響給定內核的線程親和力。不過,我傾向於避免這樣做,因爲操作系統通常很擅長讓你的線程正確。
注意
有跨越多個線程非一致內存訪問,這將導致線程阻塞對方即使沒有參與鎖定一些有趣的問題。
假設您有大量的值,並且您希望n線程對它們進行操作。您必須確保每個線程都訪問單獨緩存行上的數據,以訪問其他線程訪問的數據 - 這是一個低級問題,並不是.Net程序員(但是那些在C++或更低級別平臺上長大的人)所使用的問題來處理。
該問題在MSDN雜誌的this article中得到了很好的展示。它使迷人的閱讀。
通常由操作系統調度程序將任務分配給正在執行的內核。 設N是要運行的任務的數量,X是執行內核的數量。
如果N < X除非您有其他任務正在運行,否則您的機器資源將無法完全使用。 如果N> = X,它是OS對所有可用內核之間的線程進行負載平衡的「最佳意圖」。 實際上,您不能保證所有任務都將在單獨的核心上運行,除非您在每個任務線程上強制執行關聯。 事實上,如果您的舊操作系統不理解SMT處理器,它將會被愚弄,並且可以爲每個單核分配多個任務,而其他內核可能會空閒。
- 1. 內核線程和POSIX庫
- 2. 線程vs內核
- 3. 內核級和用戶級線程
- 4. CPU調度和內核級線程
- 5. cpu中的內核和線程
- 6. 用戶線程v.s.內核線程
- 7. OpenMP和核/線程
- 8. linux - 內核線程搶佔
- 9. PThreads:內核vs線程
- 10. get_user_pages_fast()來自內核線程
- 11. Linux內核線程問題
- 12. 用戶級別線程內核級線程和光纖
- 13. Java線程和POSIX線程,用戶或內核級別?
- 14. 內核線程和用戶線程有什麼區別?
- 15. 什麼是「內核(唯一)線程」而不是「內核級線程」?
- 16. Linux內核線程 - 調度程序
- 17. 進程vs線程(用戶vs內核)
- 18. 多線程和多核心
- 19. 多核和多線程
- 20. 用戶空間和內核線程之間的共享內存
- 21. Linux內核模塊中的內核線程之間的通信
- 22. 由於所有用戶線程都映射到內核線程,用戶線程以內核模式運行?
- 23. 線性內核vs RBF內核
- 24. 研究進程和線程在Linux 2.6內核的網站
- 25. Linux中的內核線程退出
- 26. 在xv6中實現內核級線程
- 27. 面向內核的線程感知gdb
- 28. 多線程內核如何工作?
- 29. 產生內核模式線程 - Windows
- 30. 內核線程是否被scheduller調度?
Duplicate:http://stackoverflow.com/questions/32343/how-do-i-spawn-threads-on-different-cpu-cores。 而且,通過在自己的內核上運行每個線程,您不一定會獲得更好的性能,因爲您不知道其他內核正在做什麼(操作系統知道)。 – Seth 2010-05-25 20:01:43
我認爲這個想法是爲每一個可以獨立運行的業務創建一個線程。計算機如何以及爲何決定運行線程的核心取決於各種事情,我建議您不要試圖微觀管理。 – overslacked 2010-05-25 20:03:29