線程的上下文存儲在哪里
線程的上下文信息存儲在內核空間稱為線程控制塊(Thread Control Block,簡稱 TCB)的數據結構中。線程控制塊中包含了線程在內核態和用戶態的各種狀態信息,如寄存器值、程序計數器、棧指針、優先級、狀態等
當線程切換發生時,操作系統會保存當前線程在內核態以及用戶態的上下文信息到對應線程控制塊中,并從下一個要執行的線程的線程控制塊中恢復其上下文信息。當我們說“用戶態上下文信息會被保存在內核空間的數據結構中即TCB”時,我們是在討論線程從用戶態切換到內核態的情況,比如在進行系統調用或者處理硬件中斷時。在這種情況下,當前線程的用戶態上下文(如寄存器值、程序計數器等)需要被保存到TCB中,以便線程從內核態返回用戶態時可以恢復執行
如果線程尚未發生切換,那么TCB中是不會保存用戶態信息的。線程的用戶態上下文信息只有在線程從用戶態切換到內核態時(如進行系統調用或處理硬件中斷)才會被保存到TCB中
線程切換步驟拆解
os觸發線程切換:線程切換通常由操作系統的調度器觸發,可能的原因包括時間片用完、線程阻塞等。
-
進入內核態:線程切換需要操作系統內核的支持,并且需要保存用戶態信息到內核態,因此進入內核態。如果切換觸發時線程在用戶態運行,那么從用戶態陷入內核態這個過程會導致明顯的性能開銷
保存當前線程的用戶態和內核態上下文到TCB 開銷,以便在下次恢復執行時能夠從中斷點繼續。上下文信息包括程序計數器、寄存器值、棧指針等,這將產生性能開銷
內存復制開銷:當從用戶態陷入內核態執行系統調用時,需要將系統調用的參數從用戶空間復制到內核空間,以及將系統調用的結果從內核空間復制回用戶空間。這個過程涉及到內存的讀寫操作,會產生一定的性能開銷。
特權級變更:內核態和用戶態具有不同的特權級別,內核態具有更高的權限,可以訪問所有硬件資源和內存區域。在從用戶態切換到內核態時,需要修改處理器的特權級別,這個過程需要處理器執行特定的指令,會帶來額外的開銷。
選擇下一個要運行的線程并恢復執行:操作系統調度器會根據調度算法選擇下一個要運行的線程。在開始執行新線程之前,需要恢復新線程的TCB,包括程序計數器、寄存器值、棧指針等。這將產生性能開銷
加粗部分體現了線程切換的主要開銷
協程切換的優勢體現在哪里
協程上下文信息(如寄存器值、程序計數器、棧指針等)通常保存在用戶空間的協程數據結構中
在進行協程切換時,協程運行時系統(可能是編程語言或庫提供的)會負責保存當前協程的上下文信息,并從下一個要運行的協程的數據結構中恢復其上下文信息。這個過程完全在用戶空間進行,不涉及內核態和用戶態的切換。
當用戶態的協程切換時,關聯的內核態線程的TCB會發生什么變化?沒什么變化。協程的切換只需要由協程運行時系統保存舊上下文,恢復新上下文,在這個過程中,線程的用戶態棧指針會被協程運行時系統修改以指向新協程的棧空間,從而使線程能夠在用戶空間繼續執行
總結
- 線程切換:用戶態和內存態的上下文都需要在內核空間保存和恢復
- 協程切換:用戶態上下文由協程runtime負責保存和恢復,線程在內核態的TCB不需要做任何變動,線程對用戶態的協程切換完全無感