多线程程序在多核和单核上运行的不同
1、鎖
在單核上,多個線程執行鎖或者臨界區時,實際上只有一個線程在執行臨界區代碼,而核心也只支持一個線程執行,因此不存在沖突。如果某個線程持有鎖,那只有其他線程不會被調度到CPU上執行,影響的只是持有和釋放鎖的時間,處理器時刻在運行著。但是在多核上運行時,鎖或臨界區會導致其余處理器空閑而只允許一個處理器執行持有鎖的那個線程,這是一個串行的過程,會影響性能。
2、負載均衡
單核上不用考慮負載均衡,因為各個線程輪流執行,當一個線程執行完時,則會執行另外一個線程,不存在線程等待問題。即是各個線程的任務非誠不均衡,也不會影響總執行時間。而在多核上執行時,此時最終時間由運行時間最長的線程決定;
3、任務調度
單核上,任務調度完全是操作系統的工作,無需軟件開發人員干預,通常有時間片輪轉、優先級算法等。而在多核上運行時,軟件開發人員要合理地在核心間分配任務,以盡量同時結束計算(操作系統轉向軟件開發人員)
4、程序終止
多線程環境下,程序終止時需要確定各個線程都已經計算完成。
多核多線程并行需要注意的問題:
1、線程過多:如果系統上的線程數量遠遠超過核心的數量,那么就會導致頻繁的上下文切換,進而降低性能,如緩存污染。通常支持超線程的多核處理器能夠使用的線程數最多是物理核心數的2倍,再增加就有可能降低程序的性能;
2、數據競爭:當多個線程讀寫同一共享數據時,便會產生競爭,需要同步,同步通常會導致線程之間的相互等待,潛在的降低了性能;另一方面,如果不使用同步程序可能無法并行。
3、死鎖:線程發生死鎖時,處理器都在操作(一直詢問需要的資源是否可用),但是線程都在相互等待其他線程釋放資源,處于僵持狀態。
4、餓死:當一個或多個線程永遠沒有機會調度到處理器上執行,而陷入永遠的等待的狀態。
5、偽共享:當多個線程讀寫的數據映射到同一條緩存線上時,如果一個線程更改了數據,那么其他線程對該數據的緩存就要被失效,,如果頻繁地更改數據,硬件就需要不停的更新緩存線,這使性能從獨享緩存的水平降低到共享緩存或內存的水平。
————————————————
版權聲明:本文為CSDN博主「ZIV555」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/ZIV555/article/details/52036841
總結
以上是生活随笔為你收集整理的多线程程序在多核和单核上运行的不同的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: pycharm安装过程及文件
- 下一篇: char和byte的区别