1. 程式人生 > >多執行緒的上下文切換

多執行緒的上下文切換

本人寫部落格是為了加深對知識內容的理解,文中的大部分內容都是參考於大牛方騰飛的《Java併發程式設計的藝術》,也可能會有一些自己的理解,如有錯誤,歡迎指正。

相信大家在面試的時候,都經常會被問到這個問題 – “多執行緒的速度一定比單執行緒快嗎”。這麼問也就說明答案是否定的,而這道題的精髓就在於你能不能說出上下文切換這幾個字。那什麼是上下文切換呢?

上下文切換

定義1:即使是單核的cpu也能夠執行多執行緒,cpu通過給每個執行緒分配時間片來實現這個機制。時間片是cpu分配給各個執行緒的時間,因為時間非常短,所以cpu通過不斷地切換執行緒,讓我們感覺多個執行緒是同時執行的,一般時間片為幾十毫秒。
cpu通過時間片分配演算法來迴圈執行任務,當前任務執行一個時間片後切換到下一個任務。但是,在切換前會儲存上一個任務的狀態,以便下次切換回這個任務時,可以再載入這個任務的狀態。所以任務從儲存到再載入的過程就是一次上下文切換

讀到這個定義的時候,算是對上下文切換有了點認識,但總覺得有點抽象、不夠具體,所以又從《Java多執行緒程式設計實戰指南》查找了一下概念。
定義2:多執行緒環境中,當一個執行緒的狀態由Runnable轉換為非Runnable(Blocked、Waiting、Timed_Waiting)時,相應執行緒的上下文資訊(包括cpu的暫存器和程式計數器在某一時間點的內容等)需要被儲存,以便相應執行緒稍後再次進入Runnable狀態時能夠在之前的執行進度的基礎上繼續前進。而一個執行緒從非Runnable狀態進入Runnable狀態可能涉及恢復之前儲存的上下文資訊。這個對執行緒的上下文進行儲存和恢復的過程就被稱為上下文切換。

上下文切換會帶來額外的開銷,這包括對執行緒上下文資訊儲存和恢復的開銷,對執行緒進行排程的cpu時間開銷以及cpu快取失效的開銷。