1.(單核cpu)同一時間,cpu只能處理1個執行緒,只有1個執行緒在執行
2.多執行緒同時執行:是cpu快速的在多個執行緒之間的切換
3.cpu排程執行緒的時間足夠快,就造成了多執行緒的「同時」執行
4.如果執行緒數非常多,cpu會在n個執行緒之間切換,消耗大量的cpu資源
5.每個執行緒被排程的次數會降低,執行緒的執行效率降低
切換過程:
1.a執行到度某一時間段要切換了,可a任務沒完成,系統就會把a當前執行的位置和資料以入棧的方式儲存起來
2.然後b執行緒執行,b執行時間到了,它的位置狀態等也會被系統儲存到b的棧中。
3.系統自動找到a的棧,將a之前儲存的資料恢復,又可以從a之前斷開的狀態繼續執容行下去,如此迴圈。
通常乙個任務不光 cpu 上要花時間, io 上也要花時間(例如去資料庫查資料,去抓網頁,讀寫檔案等)。 乙個程序在等 io 的時候, cpu 是閒置的,另乙個程序正好可以利用 cpu 進行計算。 多幾個程序一起跑,可以把 io 和 cpu 都跑滿了。
單核多執行緒需不需要加鎖:
需要,因為當乙個執行緒還沒執行完就已經時間片,用完了,那麼如果兩個執行緒共享某些資料,會引起衝突
1、鎖在單核上:多個執行緒執行鎖或者臨界區時,實際上只有乙個執行緒在執行臨界區**,而核心也只支援乙個執行緒執行,因此不存在衝突。如果某個執行緒持有鎖,那只有其他執行緒不會被排程到cpu上執行,影響的只是持有和釋放鎖的時間,處理器時刻在執行著。
在多核上執行時:鎖或臨界區會導致其餘處理器空閒而只允許乙個處理器執行持有鎖的那個執行緒,這是乙個序列的過程,會影響效能。
2、負載均衡
4、程式終止
多執行緒環境下,程式終止時需要確定各個執行緒都已經計算完成。
多核多執行緒並行需要注意的問題:
1、執行緒過多:如果系統上的執行緒數量遠遠超過核心的數量,那麼就會導致頻繁的上下文切換(因為會某些執行緒執行在單核上,就會時間片輪轉),進而降低效能,如快取汙染。通常支援超執行緒的多核處理器能夠使用的執行緒數最多是物理核心數的2倍,再增加就有可能降低程式的效能;
2、資料競爭:當多個執行緒讀寫同一共享資料時,便會產生競爭,需要同步,同步通常會導致執行緒之間的相互等待,潛在的降低了效能;另一方面,如果不使用同步程式可能無法並行。
3、死鎖:執行緒發生死鎖時,處理器都在操作(一直詢問需要的資源是否可用),但是執行緒都在相互等待其他執行緒釋放資源,處於僵持狀態。
4、餓死:當乙個或多個執行緒永遠沒有機會排程到處理器上執行,而陷入永遠的等待的狀態。
總之:單核不會有併發,因為多執行緒時間片輪轉;而多核,會多個執行緒同時執行,要考慮併發帶來的問題。
多執行緒程式在多核和單核上執行的不同
1 鎖 在單核上,多個執行緒執行鎖或者臨界區時,實際上只有乙個執行緒在執行臨界區 而核心也只支援乙個執行緒執行,因此不存在衝突。如果某個執行緒持有鎖,那只有其他執行緒不會被排程到cpu上執行,影響的只是持有和釋放鎖的時間,處理器時刻在執行著。但是在多核上執行時,鎖或臨界區會導致其餘處理器空閒而只允許...
關於多執行緒在多核cpu上執行效率的問題
前言 博主最近在比較python和go語言寫的web伺服器的執行效率問題,在看了google搜尋結果後,產生了疑問 1.為什麼python的非同步執行框架tornado效率可以和go語言媲美?2.為什麼隨著執行緒的增加,併發數的增長呈現逐步緩慢的趨勢?注意 為簡化推理過程和理解,以下只考慮執行任務的...
關於多執行緒在多核cpu上執行效率的問題
前言 博主最近在比較python和go語言寫的web伺服器的執行效率問題,在看了google搜尋結果後,產生了疑問 1.為什麼python的非同步執行框架tornado效率可以和go語言媲美?2.為什麼隨著執行緒的增加,併發數的增長呈現逐步緩慢的趨勢?注意 為簡化推理過程和理解,以下只考慮執行任務的...