用戶模式和內核模式區分主要是因為,為了計算機系統的正常安全運行,有些硬體資源(如:中斷裝置)和特權指令是不可以對用戶行程開放的,所以區分了兩種模式,
內核模式和用戶模式
內核空間存放的是作業系統內核代碼和資料,是被所有程式共享的,在程式中修改內核空間中的資料不僅會影響作業系統本身的穩定性,還會影響其他程式,這是非常危險的行為,所以作業系統禁止用戶程式直接訪問內核空間,
要想訪問內核空間,必須借助作業系統提供的 API 函式,執行內核提供的代碼,讓內核自己來訪問,這樣才能保證內核空間的資料不會被隨意修改,才能保證作業系統本身和其他程式的穩定性,
內核模式(Kernel Mode):用戶程式呼叫系統 API 函式稱為系統呼叫(System Call);發生系統呼叫時會暫停用戶程式,轉而執行內核代碼(內核也是程式),訪問內核空間,這稱為內核模式(Kernel Mode),
任務可以執行特權級指令,對任何I/O設備有全部的訪問權,還能夠訪問任何虛地址和控制虛擬記憶體硬體,
用戶模式(User Mode):用戶空間保存的是應用程式的代碼和資料,是程式私有的,其他程式一般無法訪問,當執行應用程式自己的代碼時,稱為用戶模式(User Mode),
硬體防止特權指令的執行,并對記憶體和I/O空間的訪問操作進行檢查,可以通過作業系統中的某種門機制進入內核模式訪問,
內核模式和用戶模式之間切換
當運行在用戶模式的應用程式需要輸入輸出、申請記憶體等比較底層的操作時,就必須呼叫作業系統提供的 API 函式,從而進入內核模式;操作完成后,繼續執行應用程式的代碼,就又回到了用戶模式,
用戶模式就是執行應用程度代碼,訪問用戶空間;內核模式就是執行內核代碼,訪問內核空間(當然也有權限訪問用戶空間),
下串列格展示了兩種模式切換程序:
| 用戶模式到內核模式 | 內核模式到用戶模式 |
|---|---|
| 由中斷/例外/系統呼叫中斷用戶行程執行而觸發 , 1.處理器模式轉為內核模式, 2.保存當前行程的PC/PSW值到核心堆疊, 3.轉向中斷/例外/系統呼叫處理程式, | OS執行中斷回傳指令將控制權交還用戶行程而觸發, 1.從待運行行程核心堆疊中彈出PC/PSW值, 2.處理器模式轉為用戶模式, |
內核級執行緒(KLT)和用戶級執行緒(ULT)
行程是資源擁有的基本單位,行程切換需要保存行程狀態,會造成資源的消耗,同一行程中的執行緒,共享行程獲取的部分資源,在同一行程中,執行緒的切換不會引起行程切換,執行緒的切換需要的資源少于行程切換,可以提高效率,
內核級執行緒(Kernel-Level Threads), KLT 也有叫做內核支持的執行緒,
- 執行緒管理的所有作業(創建和撤銷)由作業系統內核完成
- 作業系統內核提供一個應用程式設計介面API,供開發者使用KLT
用戶級執行緒(User-Level Threads ULT)
- 用戶空間運行執行緒庫,任何應用程式都可以通過使用執行緒庫被設計成多執行緒程式,執行緒庫是用于用戶級執行緒管理的一個例程包,它提供多執行緒應用程式的開發和運行支撐環境,包含:用于創建和銷毀執行緒的代碼、在執行緒間傳遞資料和訊息的代碼、調度執行緒執行的代碼以及保存和恢復執行緒背景關系的代碼,
- 所以執行緒的創建,訊息傳遞,調度,保存/恢復背景關系都有執行緒庫來完成,內核感知不到多執行緒的存在,內核繼續以行程為調度單位,并且給該行程指定一個執行狀態(就緒、運行、阻塞等),
| 內核級執行緒特點 | 用戶級執行緒的特點 |
|---|---|
| 1.行程中的一個執行緒被阻塞,內核能調度同一行程的其他執行緒(就緒態)占有處理器運行, 2.多處理器環境中,內核能同時調度同一行程的多執行緒,將這些執行緒映射到不同的處理器核心上,提高行程的執行效率, 3.應用程式執行緒在用戶態運行,執行緒調度和管理在內核實作,執行緒調度時,控制權從一個執行緒改變到另一執行緒,需要模式切換,系統開銷較大, | 1.執行緒切換不需要內核模式,能節省模式切換開銷和內核資源, 2.允許行程按照特定的需要選擇不同的調度演算法來調度執行緒,調度演算法需要自己實作, 3.由于其不需要內核進行支持,所以可以跨OS運行, 4.不能利用多核處理器有點,OS調度行程,每個行程僅有一個ULT能執行 5.一個ULT阻塞,將導致整個行程的阻塞, |
jacketing技術可以解決用戶級執行緒ULT一個執行緒阻塞導致整個行程阻塞,
jacketing的目標是把一個產生阻塞的系統呼叫轉化成一個非阻塞的系統呼叫,例如,當行程中的一個執行緒呼叫IO中斷錢,先呼叫一個應用級的I/O jacket例程,而不是直接呼叫一個系統I/O,讓這個jacket例程檢查并確定I/O設備是否忙,如果忙,則jacketing將控制權交給該行程的執行緒調度程式,決定該執行緒進入阻塞狀態并將控制權傳送給另一個執行緒(若無就緒態執行緒咋可能執行行程切換),
執行緒實作的組合策略
可以看出,用戶級執行緒和內核級執行緒都有各自的優點和缺點,在應用上主要表現為:
- 用戶級多執行緒對于處理邏輯并行性問題有很好的效果,不擅長于解決物理并發問題,
- 內核級多執行緒適用于解決物理并行性問題,
組合策略:
由作業系統內核支持內核級多執行緒,由作業系統的程式庫來支持用戶級多執行緒,執行緒創建完全在用戶空間創建,現成的調度也在應用程式內部進行,然后把用戶級多執行緒映射到(或者說是系結到)一些內核級多執行緒,
編程人員可以針對不同的應用特點調節內核級執行緒的數目來達到物理并行性和邏輯并行性的最佳方案,

參考文章
- https://blog.csdn.net/winterfeng123/article/details/79788714
- https://blog.csdn.net/sinat_38104725/article/details/98474760
- https://blog.csdn.net/winterfeng123/article/details/79784430
- https://docs.microsoft.com/zh-cn/windows-hardware/drivers/gettingstarted/user-mode-and-kernel-mode
- https://www.kanzhun.com/msh/post/1691.html
關注公眾號 ,專注于java大資料領域離線、實時技術干貨定期分享!個人網站 www.lllpan.top

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/271341.html
標籤:其他
下一篇:PATbasic1009詳解
