操作系統全部筆記目錄 見:操作系統筆記整理
爲什麼沒有用戶級進程?這是因爲進程需要分配資源,資源是統一分配的。
多處理器,多核,如果系統沒有核心級線程,多核是沒什麼用的。多處理器中,每個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,然後申請一段內存作爲內核棧。