多執行緒數量思考
上下文切換
即使是單核CPU也支援多執行緒執行程式碼,CPU通過給每個執行緒分配CPU時間片來實現這個機制(因為通常一個任務不光cpu上要花時間,io上也要花時間,一個程序在等 io的時候,cpu 是閒置的,另一個程序正好可以利用cpu把cpu該做的事做完。多幾個程序一起跑,可以把 io 和 cpu 都跑滿了,可以充分利用CPU空閒)。時間片是CPU分配給各個執行緒的時間,因為時間片非常短,所以CPU通過不停地切換執行緒執行,讓我們感覺多個執行緒時同時執行的,時間片一般是幾十毫秒(ms)。
CPU通過時間片分配演算法來迴圈執行任務,當前任務執行一個時間片後會切換到下一個任務。但是,在切換前會儲存上一個任務的狀態,以便下次切換回這個任務時,可以再次載入這個任務的狀態,從任務儲存到再載入的過程就是一次上下文切換。
這就像我們同時讀兩本書,當我們在讀一本英文的技術書籍時,發現某個單詞不認識, 於是便開啟中英文詞典,但是在放下英文書籍之前,大腦必須先記住這本書讀到了多少頁的第多少行,等查完單詞之後,能夠繼續讀這本書。這樣的切換是會影響讀書效率的,同樣上下文切換也會影響多執行緒的執行速度。
問題:N核CPU執行N個執行緒,是否不存在上下文切換?
結論:
使用多執行緒往往可以獲得更大的吞吐率和更短的響應時間,但是,使用多執行緒不一定就比單執行緒程式跑的快,這取決於我們程式設計者的能力以及應用場景的不同。
考慮到記憶體限制、資源爭奪(除了CPU執行上下文切換的消耗以外,執行緒的執行還將有其他一些資源的消耗,比如:記憶體同步的開銷(執行緒需要一些記憶體在維持執行緒本地棧,每個執行緒都有本地獨立的棧用以儲存執行緒專用資料),上下文切換的開銷,執行緒建立和消亡的開銷,以及排程的開銷(佔用作業系統的一些資源來管理和協調執行緒))、CPU密集型應用還是IO密集型應用