多線程的上下文切換

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

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

上下文切換

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

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

上下文切換會帶來額外的開銷,這包括對線程上下文信息保存和恢復的開銷,對線程進行調度的cpu時間開銷以及cpu緩存失效的開銷。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章