內核態:cpu可以訪問內存的所有數據,包括外圍設備,例如硬盤,網卡,cpu也可以將自己從一個程序切換到另一個程序。
用戶態:只能受限的訪問內存,且不允許訪問外圍設備,占用cpu的能力被剝奪,cpu資源可以被其他程序獲取。
為什么要有用戶態和內核態?
就像世界上的人並不平等一樣,並不是所有的程序都是平等的。世界上有的人占有資源多,有的人占有資源少,有的人來了,別人得讓出資源,有的人則專門為別人讓出資源。程序也是這樣,有的程序可以訪問計算機的任何資源,有的程序則只能訪問非常受限的少量資源。而操作系統作為計算機的管理者,自然不能和被管理者享受一樣的待遇,它應該享有更多的方便或特權。為了區分不用程序的不同權利,人們發膽了內核和用戶態的概念。
那么什么是內核態,什么是用戶態呢?只要想一想現實生活中,處於社會核心的人與處於社會邊緣的人有什么區別就能明白處於核心的人擁有的資源多!因此,內核態就是擁有資源多的狀態,或者說訪問資源多的狀態,我們也稱之為特權態。相對來說,用戶態就是非特權態,在此種狀態下訪問的資源將受到限制。如果一個程序運行在特權態,則該程序就可以訪問計算機的任何資源,即它的資源訪問權限不受限制。如果一個程序運行在用戶態,則其資源需求將受到各種限制。
例如,如果要訪問操作系統的內核數據結構,如進程表,則需要在特權態下才能辦到。如果要訪問用戶程序里的數據,則在用戶態下就可以了。
由於內核態的程序可以訪問計算機的所有資源,這種程序的可靠性和安全性就顯得十分重要。試想如果一個不可靠的程序在內核態下修改了操作系統的各種內核數據結構,結果會怎樣呢?整個系統有可能崩潰。而運行於用戶態的程序就比較簡單了,如果其可靠性和安全性出了問題,其造成的損失只不過是讓用戶程序崩潰,而操作系統將繼續運行。
很顯然,內核態和用戶態各有優勢:運行在內核態的程序可以訪問的資源多,但可靠性、安全性要求高,維護管理都較復雜;用戶態程序訪問的資源受限,但可靠性、安全性要求低,自然編寫維護起來都較簡單。一個程序到底應該運行在內核態還是用戶態取決於其對資源和效率的需求。
一般來說,一個程序能夠運行於用戶態,就應該讓它運行在用戶態。只在迫不得已的情況下,才讓程序運行於內核態。只要看看一個國家的治理就清楚了。我們拿什么標准來判斷什么事情應該歸國家領導管理。凡是牽扯到計算機本體根本運行的事情都應該在內核態下執行,只與用戶數據和應用相關的東西則放在用戶態執行。另外,對時序要求特別高的事情,也應該在內核態做。你有沒有想過,國家領導出門怎么不塞車呢?
那么什么樣的功能應該在內核態下實現呢? 首先,CPU管理和內存管理都應該在內核態實現。這些功能可不可以在用戶態下實現呢?當然能,但是不太安全。就像一個國家的軍隊(CPU和內存在計算機里的地位就相當於一個國家的軍隊的地位)交給老百姓來管一樣,是非常危險的。所以從保障計算機安全的角度來說,CPU和內存的管理必須在內核態實現。
診斷與測試程序也需要在內核態下實現。因為診斷和測試需要訪問計算機的所有資源,否則怎么判斷計算機是否正常呢?就像中醫治病,必須把脈觸摸病人。你不讓中醫觸摸,他怎么能看病呢(當然,很多人認為中醫是偽科學,根本治不了病,本書對此問題不做討論)?輸入輸出管理也一樣,因為要訪問各種設備和底層數據結構,也必須在內核態實現。
對於文件系統來說,則可以一部分放在用戶態,一部分放在內核態。文件系統本身的管理,即文件系統的宏數據部分的管理,必須放在內核態,不然任何人都可能破壞文件系統的結構;而用戶數據的管理,則可以放在用戶態。編譯器、網絡管理的部分功能、編輯器用戶程序,自然都可以放在用戶態下執行。