【轉載】理解用戶模式和內核模式(譯)
理解用戶模式和內核模式(譯)
###理解用戶模式和內核模式
本文出處: http://blog.codinghorror.com/understanding-user-and-kernel-mode/
絕大多數的操作系統都可以顯示CPU的使用情況。在Windows上,我們可以使用任務管理器(Task Manager)
查看.
CPU的使用率(CPU Usage)大體上可以表示CPU花在處理非空閑任務的時間的比率。這只是一種簡化的說法。實際上,在所有的現代操作系統中,CPU是在兩種不同的模式下運行的:
-
Kernel Mode
在內核模式下,代碼具有對硬件的所有控制權限。可以執行所有CPU指令,可以訪問任意地址的內存。內核模式是為操作系統最底層,最可信的函數服務的。在內核模式下的任何異常都是災難性的,將會導致整臺機器停機。 -
User Mode
在用戶模式下,代碼沒有對硬件的直接控制權限,也不能直接訪問地址的內存。程序是通過調用系統接口(System APIs)來訪問硬件和內存的。在這種保護模式下,即時程序發生崩潰也是可以恢復的。在你的電腦上大部分程序都是在用戶模式下運行的。
如上圖所示,可以讓任務管理器顯示內核的CPU占用時間。綠色的線表示總的CPU時間,紅色的線表示內核使用的CPU時間,兩者之間的間隔就是用戶程序使用的CPU時間。
上面所說的兩種模式不僅僅是字面上的區別,它們是受CPU嚴格制約的。如果在用戶模式下,程序嘗試做些其權限以外的事情,比如說,執行一條高權限的CPU指令,修改其被禁止訪問的內存,這時一個可捕獲的異常就會拋出。但這只會導致這個倒黴的應用程序崩潰,而不會讓你的整個系統崩潰。這就是用戶模式的意義所在。
x86 CPU提供4種保護層級: 0, 1, 2 and 3. 實際上,只用0級(內核)和3級(用戶程序)被使用到了。
有點讓人疑惑的是,如果我們只使用了兩種保護層級(內核,用戶程序),那些可以讓我們訪問顯卡,鍵盤,鼠標,打印機的設備驅動代碼應該在哪層運行。為了最佳的性能,設備代碼應該運行在內核模式?還是為了追求穩定,讓它們運行在用戶模式下?至少在Windows操作系統上,答案得視情況而定。設備驅動代碼可以運行在用戶模式,也可以運行在內核模式。如今,大多數的設備驅動代碼都運行在用戶模式下,當然也有例外,為了最佳的性能,顯卡驅動是運行在內核模式下的。不過時代在變,在Windows Vista系統中,顯卡驅動就已經被分成了用戶段和內核段。這或許也是為什麽會有遊戲開發人員抱怨Vista平臺上的遊戲的性能會低上10%左右。
這些模式之間的界限一直不是很明確。什麽樣的代碼應該運行在用戶模式下?什麽樣的代碼應該運行在內核模式下?或者我們可以再加一個地下室,虛擬化的要求催生了一個新的保護層級,-1級,在所有保護層級之下,這就是我們熟知的x86的硬件層虛擬化。
用戶模式總的來說是有益無害的,但是代價卻是昂貴的。在用戶模式和內核模式之間的轉換代價是非常高的。比如說,程序拋出異常通常都是很耗時的。異常意味著模式的轉換。當然了,如今的計算機的資源如此豐富,我們很少去關心模式轉換的代價。可是,當你的程序需要的資源變多時,你就需要為這些事操心了。
區分用戶模式和內核模式最典型的例子應該要數webserver了。在一些開源的web服務器將代碼放在內核模式運行而贏得行業benchmark的勝利後,Microsfot也將IIS 6一些核心的功能移到內核模式下運行。如果你要問我的看法的話,我會說這是一場沒有意義的較量,因為雙方都只是針對靜態的HTML做了內核優化。但就是這樣,不管是針對benchmark還是其它的競爭。
CPU對用戶模式和內核模式的嚴格限制對於用戶來說是透明的,其實也就是程序經常崩潰和電腦經常崩潰的區別。這就是我們這些寫出崩潰代碼的程序員們口中所說的”進步”。所以,我代表各地的程序員們,對”用戶模式”說句謝謝。你真棒!
【轉載】理解用戶模式和內核模式(譯)