1. 程式人生 > >多執行緒程式在多核和單核上執行的不同

多執行緒程式在多核和單核上執行的不同

1、鎖

在單核上,多個執行緒執行鎖或者臨界區時,實際上只有一個執行緒在執行臨界區程式碼,而核心也只支援一個執行緒執行,因此不存在衝突。如果某個執行緒持有鎖,那只有其他執行緒不會被排程到CPU上執行,影響的只是持有和釋放鎖的時間,處理器時刻在執行著。但是在多核上執行時,鎖或臨界區會導致其餘處理器空閒而只允許一個處理器執行持有鎖的那個執行緒,這是一個序列的過程,會影響效能。

2、負載均衡

單核上不用考慮負載均衡,因為各個執行緒輪流執行,當一個執行緒執行完時,則會執行另外一個執行緒,不存線上程等待問題。即是各個執行緒的任務非誠不均衡,也不會影響總執行時間。而在多核上執行時,此時最終時間由執行時間最長的執行緒決定;

3、任務排程

單核上,任務排程完全是作業系統的工作,無需軟體開發人員干預,通常有時間片輪轉、優先順序演算法等。而在多核上執行時,軟體開發人員要合理地在核心間分配任務,以儘量同時結束計算(作業系統轉向軟體開發人員)

4、程式終止

多執行緒環境下,程式終止時需要確定各個執行緒都已經計算完成。

多核多執行緒並行需要注意的問題:

1、執行緒過多:如果系統上的執行緒數量遠遠超過核心的數量,那麼就會導致頻繁的上下文切換,進而降低效能,如快取汙染。通常支援超執行緒的多核處理器能夠使用的執行緒數最多是物理核心數的2倍,再增加就有可能降低程式的效能;

2、資料競爭:當多個執行緒讀寫同一共享資料時,便會產生競爭,需要同步,同步通常會導致執行緒之間的相互等待,潛在的降低了效能;另一方面,如果不使用同步程式可能無法並行。

3、死鎖:執行緒發生死鎖時,處理器都在操作(一直詢問需要的資源是否可用),但是執行緒都在相互等待其他執行緒釋放資源,處於僵持狀態。

4、餓死:當一個或多個執行緒永遠沒有機會排程到處理器上執行,而陷入永遠的等待的狀態。

5、偽共享:當多個執行緒讀寫的資料對映到同一條快取線上時,如果一個執行緒更改了資料,那麼其他執行緒對該資料的快取就要被失效,,如果頻繁地更改資料,硬體就需要不停的更新快取線,這使效能從獨享快取的水平降低到共享快取或記憶體的水平。