06核心級線程

  前面已經說了,由於操作系統感知不到用戶級線程的存在,當某個用戶級線程異常阻塞(頁面故障)時會一直卡在那,無法調用其他線程,並且有些操作必須陷入內核,因此儘管內核級線程開銷大,但仍然需要。實際上很多進程中既有用戶級線程也有核心級線程,如下圖所示

               

1 另外插一句:多核計算機真正意義上實現了內核級線程的並行(不同於切換),在此我們區分一下多處理器和多核
              

多處理器只是通過總線相聯,而各個處理器的緩存和內存管理單元(MMU)是分離的,而多核是共享緩存和MMU的。我們回憶一下線程:線程就是進程內共享內存的“輕量級進程”。因此多處理器並不能支持同一進程內的多線程並行,而多核計算機,統一進程內的多線程可以分給不同的核同時執行,即並行。而在用戶級線程中,由於核心只將處理器分配給進程,因此同一進程內的兩個用戶級線程不能分到兩個處理器。

2 和用戶級線程相比,核心級線程有什麼不同?
 內核級線程的創建,管理(TCB),切換等都是由內核負責,而用戶級線程的創建、切換等由用戶設置。
在05節用戶級線程中說到,用戶級線程各有自己的一個棧存放狀態信息,兩個線程間的切換通過兩個棧的切換完成。而內核級線程的切換是通過兩套棧之間的切換完成的,即用戶棧內核棧。如下圖所示
 

對於用戶來說,進程1和進程2的切換隻能看到用戶棧切換,內核是不可見的。實際上兩個進程切換用戶態和內核態的都有。過程如下:

1.用戶棧和內核棧相關聯:通過中斷陷入內核時,將用戶態的SS:SP壓入內核棧,SS是棧的段地址,SP是棧的偏移地址,SS:SP指向棧頂。

2.通過中斷線程1的用戶棧切到內核棧

3.線程1通過Schedule調度算法調到線程2.由TCB1切到TCB2,完成線程的切換,這時內核裏是線程2的用戶棧

4.線程2通過iret指令,由內核棧切到用戶棧

5.用戶看到的是線程1的用戶棧切到了線程2的用戶棧

最後比較一下用戶級線程和內核級線程

 

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