操作系統內核級線程

操作系統全部筆記目錄 見:操作系統筆記整理

爲什麼沒有用戶級進程?這是因爲進程需要分配資源,資源是統一分配的。

多處理器,多核,如果系統沒有核心級線程,多核是沒什麼用的。多處理器中,每個CPU都有自己的一套映射,而多核是公用同一套映射。核心級線程中,多核可以共用同一套MMU和緩存。

如果是用戶級線程,操作系統看不到,就沒法分配資源,沒法發揮多核的價值。

多核級線程(難度大,可以以後進行學習)

核心級線程就不是兩個棧了,而是兩套棧。因爲用戶級線程只會在用戶棧裏跑,但是使用核心級線程的程序,既需要在用戶層跑,也需要在內核裏跑。

在用戶級線程,先TCB切,然後根據TCB切換用戶棧。核心級線程,是TCB切換,然後用戶棧和內核棧都得需要切換。

在內核中運行的時候要調用C函數等,使用內核棧。只有通過中斷才能進入內核。Intel硬件會啓動對應的內核棧,把SS和SP(在用戶態執行的棧)壓棧,以及PC指針壓棧。如上圖,就像拉了一條線,一套棧(用戶棧+內核棧)。

read是庫,裏面執行內核程序,然後執行中斷。read上面的東西都是在用戶棧裏執行的,所以104和204壓棧,然後執行read。int工作以後就把這一套棧設置好,CS在這裏指向段基址,然後執行sys_read內核程序。

返回的時候則是根據SS和SP返回用戶棧。

阻塞以後就會引起調度,然後引發下一個線程。

switch_to函數中,cur是當前線程的TCB,next是下一個線程的TCB。但是這個時候是找內核棧的指針,esp指向線程T的最下面,然後ret彈棧,從esp最下面指向的東西繼續執行。

????裏面的代碼應該是一段包含iret中斷返回的代碼,

PC和CS就是線程T用戶態的代碼。

畫個圖好好解釋一下:

首先我們創建線程的時候,每當一個線程打算切換到另外一個線程,它都會做出如下創建:

假設現在線程S要入棧,通過中斷進入到內核,然後通過TCB建立這套棧的綁定。

切換時,從當前的TCB切換到另一個TCB:

切換到的TCB裏面有線程T的內核棧,線程T的內核棧又關聯了線程T的用戶棧。通過中斷返回機制返回到用戶態的線程裏去執行線程T的代碼。

首先申請一段內存作爲TCB,然後申請一段內存作爲內核棧。

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