為什麼說執行緒太多,cpu切換執行緒會浪費很多時間?
阿新 • • 發佈:2020-11-21
問題1:
假如有一個計算任務,計算1-100的和,每10個數相加,需要佔用一個cpu時間片(1s)。如果起一個執行緒(模擬沒有執行緒切換),完成任務需要多長時間?如果起5個執行緒,完成任務需要消耗多久時間?如果起20個執行緒,完成任務需要多長時間?如果起20個執行緒呢?20個執行緒呢?50個執行緒呢? 假設1:cpu是單核cpu假設2:每個執行緒的優先順序一樣。 假設3:cpu在兩個執行緒之間切換的時間消耗是0.1s。 答: 1.如果起1個執行緒(模擬沒有執行緒切換)就要消耗10s的cpu時間能完成任務。 2.如果起5個執行緒,每個執行緒處理20個數相加,所以要佔用2個cpu時間片,即10s,cpu要切換9次,即0.9s,總耗時10s+0.9s=10.9s; 3.如果起10個執行緒,每個執行緒處理10個數相加,要消耗1個cpu時間,即10s,cpu要切換9次,即0.9s,總耗時10s+0.9s=10.9s。 4.如果起20個執行緒,每個執行緒處理5個數相加,佔用0.5個時間片,即消耗10s,cpu要切換19次,即1.9s,總耗時10s+1.9s=11.9s。 5.如果起50個執行緒,每個執行緒處理2個數相加,佔用0.2個時間片,即消耗10s,cpu要切換50次,即5s,總耗時10s+5s=15s。 總結:1個執行緒最快,起5個執行緒和10個執行緒的耗時是一樣的,20個執行緒會更慢,所以執行緒數不是越多越好。 問題2: 假如有一個計算任務,計算1-100的和,每10個數相加,需要佔用一個cpu時間片(1s),同時要在本地檔案(模擬io阻塞)記一次數,會阻塞2s。如果起1個執行緒,完成任務需要耗時多少?如果起5個執行緒,完成任務需要消耗多久時間?如果起10個執行緒,完成任務需要多長時間?如果起20個執行緒呢?50個執行緒呢? 假設1:cpu是單核cpu
假設2:每個執行緒的優先順序一樣。 假設3:cpu在兩個執行緒之間切換的時間消耗是0.1s。 答: 1.如果起1個執行緒(模擬沒有執行緒切換)處理數字相加需要消耗10s,寫檔案(阻塞)要消耗20s,總共需要消耗10s+20s=30s。 2.如果起5個執行緒,每個執行緒處理20個數相加,每個執行緒處理數字相加要2s,阻塞要4s。第一輪cpu時間片輪轉導致執行緒切換,每個執行緒都計算完各自的10個數字,五個執行緒計算數字要5s,並且cpu切換了4次,切換要用0.4s,所以第一輪耗時5s+0.4s+=5.4s;然後開始第二輪,因為第二輪每個執行緒都是處理寫檔案的事情,那是dma的事情,執行緒會阻塞出讓cpu,所以cpu直接切換,連續切換四次,加上第一輪到第二輪的切換,一共5次切換,切換佔用0.5s,所以第二輪cpu都是耗線上程切換上,第二輪耗時0.5s。然後開始第三輪,這時候第一個執行緒還要阻塞1.5s(2-0.5=1.5)才能開始執行三輪,所以這1.5s範圍內,cpu是空閒的。過了1.5秒之後,開始第三輪和第四輪,分別和前面的第一輪和第二輪一樣,分別是,第三輪耗時5.4s,第四輪耗時0.5s。但是第四輪第5個執行緒切換之後,還要等待2s,第五個執行緒才完成檔案io。所以起五個執行緒,cpu要切換四輪,總消耗5.4s(第一輪)+0.5s(第二輪)+1.5s(等待io)+5.4s(第三輪)+0.5s(第四輪)+2s(io等待)=15.3s。 3.如果起10個執行緒,每個執行緒處理10個數相加,要消耗1個cpu時間,即10s,cpu要切換9次,即0.9s,第一輪耗時10s+9s=10.9s;第二輪因為是io阻塞,直接切換,要切換10次,切換耗時1s,然後繼續等待第五個執行緒的io完成,等待1s(io要2s,切換執行緒過了1s,2-1=1)即可;所以總耗時是10.9s+1s+1s=12.9s。 4.如果起20個執行緒,每個執行緒處理5個數相加,第一輪切換29次執行緒,切換佔用2.9s,計算數字需要10s,每切換兩個執行緒,就io阻塞一次,ios阻塞10次,最後一次切換執行緒之後,還要等待最後一個執行緒的io,要等待2s。所以一共耗時2.9s+10s+2s=14.9s。 5.如果起50個執行緒,每個執行緒處理2個數相加,第一輪切換49次執行緒,切換佔用4.9s,每切換5次執行緒,就io阻塞一次,計算數字要10s,,最後一次切換執行緒之後,還要等待最後一個執行緒的io,要等待2s。所以總耗時是:4.9s+10s+2s=16.9s。 總結:1個執行緒最快,起5個執行緒和10個執行緒的耗時是一樣的,20個執行緒會更慢,所以執行緒數不是越多越好。 以下附上兩個自己畫的圖,便於理解:
歡迎關注微信公眾號“ismallboy”,請掃碼並關注以下公眾號,並在公眾號下面回覆“FGC”,獲得本文最新內容。