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

2021-07-15 14:49:44 字數 840 閱讀 5852

1、鎖

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

2、負載均衡

3、任務排程

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

4、程式終止

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

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

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

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

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

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

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

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

1.單核cpu 同一時間,cpu只能處理1個執行緒,只有1個執行緒在執行 2.多執行緒同時執行 是cpu快速的在多個執行緒之間的切換 3.cpu排程執行緒的時間足夠快,就造成了多執行緒的 同時 執行 4.如果執行緒數非常多,cpu會在n個執行緒之間切換,消耗大量的cpu資源 5.每個執行緒被排程的次...

關於多執行緒在多核cpu上執行效率的問題

前言 博主最近在比較python和go語言寫的web伺服器的執行效率問題,在看了google搜尋結果後,產生了疑問 1.為什麼python的非同步執行框架tornado效率可以和go語言媲美?2.為什麼隨著執行緒的增加,併發數的增長呈現逐步緩慢的趨勢?注意 為簡化推理過程和理解,以下只考慮執行任務的...

關於多執行緒在多核cpu上執行效率的問題

前言 博主最近在比較python和go語言寫的web伺服器的執行效率問題,在看了google搜尋結果後,產生了疑問 1.為什麼python的非同步執行框架tornado效率可以和go語言媲美?2.為什麼隨著執行緒的增加,併發數的增長呈現逐步緩慢的趨勢?注意 為簡化推理過程和理解,以下只考慮執行任務的...