一、概念

首先我們先來複習一下作業系統的概念和作用

作業系統是使用者和硬體之間的一層媒介程式,為上提供程式設計介面,為下呼叫資源,管理驅動,以使用硬體。

從以上的表述我們可以看出OS的兩點作用,第一個是對下直接管理和使用硬體,第二個則是對上提供管理和使用硬體的介面。而在作業系統中,對下管理和使用硬體的那些程式,我們稱之為核心程式,核心程式主要要做的一些事是

  1. 記憶體管理
  2. 檔案管理(包括IO
  3. 程序排程和程序間通訊
  4. 裝置管理(裝置分配、裝置傳輸控制 、裝置獨立性)

而使用核心程式提供的那些介面我們則可以稱之為使用者程式。例如我們的一些網絡卡或者其他的驅動,也是屬於核心程式對上提供的介面,使用者可以通過這些驅動來管理網絡卡。因此我們可以規範一下核心程式和使用者程式的概念,以下為我的個人理解

核心程式:作業系統中,可以訪問所有硬體裝置,如網絡卡、記憶體裝置等的一些特殊的高許可權的系統程式,

使用者程式:只能有限的訪問部分記憶體空間,對硬體裝置沒有訪問許可權的低許可權的應用程式或系統程式

有人可能會問了,那我平常用一些自己寫的應用程式,也可以訪問硬盤裡的東西,或者開啟對攝像頭的控制,這是不是說明我也能訪問硬體裝置呢?當然不是啦!我們平常寫的程式,最後實際上可以看作,執行到了一定的階段,就會託管給核心程式,由核心程式去完成的。

並且在作業系統中,記憶體空間也被劃分成了核心空間和使用者空間。核心程式會始終的佔據著記憶體的一些空間,方便處理器去呼叫核心程式,而使用者程式是自始至終接觸不到這些核心空間的。

我們執行一個程式的整個流程是這樣的,使用者程式完成一定的事情,然後交由核心程式去處理,核心程式處理完畢之後,將處理的結果或者說處理完成的資料,再交由使用者程式去執行,在整個過程中,使用者程式是完全接觸不到核心空間的。

二、問題

那麼問題來了,作業系統為什麼要這麼大費周章的劃分核心和使用者之間的區別呢?我們從實際生活的一個例子出發去探討這個問題。假設你去一家飯店吃飯,點好菜,由服務員通過餐口,轉告給廚房的工作人員,等廚房的工作人員,比如廚師,切菜的人員,把菜做好了,再通過送餐口讓服務員送到你的面前。

我們來分析一下這個過程,在這個過程中,你點菜這個操作,就相當於作業系統中的使用者程式,而服務員和送餐口,就是廚房和外部連線的通道,服務員和送餐口都可以看作是作業系統中的驅動程式,你通過他們來告訴廚房你需要什麼菜。然後廚房做菜的這個過程,就是相當於核心處理使用者程式的請求,最後從送餐口送餐的這個過程,就等於是核心處理完之後,將處理完成的資料再轉交給使用者程式。而做菜的過程,對於顧客來說是完全的一個黑盒,使用者不知道里面發生了什麼,也無法參與做菜,使用者能看到的,只有從餐口端出來的那盤菜。另外像廚房,倉庫這些重要的地方,你作為一個顧客肯定是進不去的,這些地方只有飯店的核心人員,比如廚師,老闆才能進入,你能活動的區域只能飯店的大廳這些公共的區域。這就相當於作業系統把記憶體的空間,劃分為了使用者空間和記憶體空間,並且強制規定使用者不允許進入記憶體空間。

因此我們大致上可以得出幾個概念對應例子中的等式,

核心程式 == 廚師 切菜人員,備菜人員,每種程式有不同的功能,同樣的每類職業也有不同的職責,

使用者程式 == 顧客 每個顧客想要的菜都不一樣,對核心的請求也不一樣

核心空間 == 廚房 廚房只允許廚師和備菜的進入,同樣的核心空間也只允許核心程式進入

使用者空間 == 大廳

到了這裡,我們就可以來回答一下上面的問題了 “作業系統為什麼要這麼大費周章的劃分核心和使用者之間的區別呢” ,答案是首先作業系統的核心是核心,可以訪問幾乎底層的所有裝置和空間,至關重要,為了保護核心的安全,因此作業系統會強制性的使用者程式不允許訪問核心空間,核心空間只有核心程式可以訪問,使用者程式只允許通過核心提供的介面來請求,這樣劃分對整個作業系統的穩定性和安全性是一種有力的保護。其實這樣也很好理解,試想如果是一家飯店的廚房,不管是誰都可以隨隨便便的進出,毫無限制,那這家廚房的食品安全問題一定也得不到保障,你還會放心的去這家飯店吃飯嗎?

我們通過上面舉的例子,再來總結作業系統處理資料的整個過程就會顯得好理解很多了。當我們需要讀取一條資料的時候,首先需要發請求告訴核心,我需要什麼資料,等核心準備好資料之後再從核心空間拷貝到使用者空間 注意加粗的部分,這兩個階段至關重要

第一階段 :等待核心準備資料

第二階段:資料從核心空間拷貝到使用者空間

那麼為什麼我們明明是講網路IO,卻要大費周章的講這麼多作業系統的東西呢,因為本身IO操作就是由作業系統控制的,而我們傳送一個IO請求,IO讀寫也是要經過以上的這些核心程式執行資料準備和拷貝過程的,如果不把這些講明白了,那麼後面我們要提到的,阻塞和讀寫過程必然將是一團霧水。而以上我們所重點強調的兩個階段,則是決定著各種IO模型的條件。包括後面要講到的阻塞IO(BIO),非阻塞IO(NIO),IO多路複用,訊號驅動IO,全非同步IO(AIO),都是和上面兩個階段以及作業系統知識密切相關的。以上的兩個過程和作業系統整個資料處理流程,務必要理解和記住,之後的文章,都是基於以上OS的整體流程,可以說是網路IO的基石中的基石

三、總結

  1. 作業系統為了安全性和穩定性考慮,因此將執行程式分為核心程式和使用者程式,將記憶體空間分為核心空間和使用者空間,核心程式對下直接對硬體進行使用和管理,對上提供介面給使用者程式使用

  2. 使用者程式不允許直接訪問核心空間,而是轉交給核心程式,由核心程式處理好,再拷貝到使用者空間供使用者程式使用

  3. 不管是對於IO還是其他資料處理的操作而言,有兩個重點階段,分別是,一、等待核心準備資料階段,二、資料從核心空間拷貝至使用者空間階段,這兩個階段決定了IO的阻塞於否,非常重要