這是作業系統系列第 2 篇,
如果你想知道作業系統每天都在做些什么,那就打開你的資源監視器:

資源監視器截圖,Windows 10
單獨通過這一張圖,我們就能夠總結出作業系統的幾個重要功能:
- 行程管理
- 執行緒管理
- 記憶體管理
- I/O 管理(包含了磁盤調度)
- 檔案管理,這一功能在圖里沒有表現出來,但我相信每個使用計算機的人都知道它,
為什么我要從行程開始講起呢?
原因很簡單,我們每天使用計算機,包括手機和電腦,本質上是使用運行在其作業系統上的應用程式,對于我們來講,作業系統最為直觀的功能就是行程管理,所以,讓我們從行程管理入手,由表及里,一步步深挖作業系統的本質,
行程是什么?
我在第一篇文章里簡單提到了行程這一概念,這里再詳細講一下,加深理解,
作業系統的設計從根本上來說是為了迎合用戶需求,對個人用戶來說,需求就是在一臺計算機上運行多個應用程式,以滿足生活和作業的需要,但應用程式這么多,不可能讓每一個程式占用一個 CPU 核心啊,因為 CPU 核心是有限的,人的需求是無限的,
所以作業系統就需要將無限(夸張一下)的應用程式,分配到有限的 CPU 上去,
當我們打開一堆程式時,這些程式就會被加載到記憶體上,為了讓這些運行的程式與沒有打開的程式作區分,我們創造了行程(Process)這個名詞,所以,行程就是對運行的程式的一種抽象,具有動態性,行程管理其實就是作業系統通過某種方式,管理我們已經打開的程式,
注:為了簡化后面的討論,我們假設所說的計算機是單核的,
行程的狀態有哪幾種?
講到行程,我們必然需要了解行程狀態,想要了解行程的狀態,我們就得從行程的角度,看一看行程的一生會發生什么,
首先,用戶打開某個應用程式,這個程式就處于新建態(New),這個時候作業系統還沒有為這個程式做好準備作業,這個行程自身還沒有進入記憶體,可能還留在磁盤里,
等到這個行程被加載進記憶體,就代表它已經準備好運行了,但因為 CPU 資源正被別的行程占用,它只能等待作業系統為它分配 CPU,這個狀態稱為就緒態(Ready),
在就緒態一段時間后,總會分配到 CPU 資源,一旦行程開始執行,它就進入了運行態(Running),
有的行程可能會執行某些阻塞操作,就拿 I/O 操作來舉例子,執行操作后,行程需要等待 I/O 操作完成,第一篇文章講過,行程在這段時間內是無法使用 CPU 的,如果讓它繼續占用 CPU,就造成了資源浪費,所以作業系統會剝奪它的 CPU 使用權,并把它放在阻塞態,等到 I/O 操作結束后,再將其放入就緒態,
還有最后一種狀態——退出態,顧名思義,行程終止后,就會進入退出態,這個行程可能還沒有從記憶體中清理出去,等到行程完全退出記憶體,行程的一生就徹底結束了,
綜合以上的討論,我們得到了行程的 5 種狀態:

細心的讀者可能會發現,運行態到阻塞態,以及阻塞態到就緒態之間的箭頭是單向的,為什么?
先來看看運行態和阻塞態,回憶一下,一個行程處于阻塞態代表什么?(希望你看到這確實停下來思考了)
一個行程處于阻塞態,代表行程執行了某個阻塞操作,正在等待操作的結果,也就是說,處于阻塞態的行程沒有使用 CPU 的能力,所以即使給了它 CPU 它也沒辦法運行,自然無法進入執行狀態,所以從阻塞態是無法直接跳到運行態的,
再來說說就緒態和阻塞態,如果一個行程位于就緒態,說明它現在沒有使用 CPU,所以更不可能執行阻塞操作,因此從就緒態也不能直接跳轉到阻塞態,
結合剛剛的解釋,我們來看看一個簡單的行程的排隊模型:

圖中的 ABCDEF 代表了行程
要注意的是,就緒態,運行態和阻塞態提供了一種描述行程行為的系統方法,指導了作業系統的實作,許多實際的作業系統都是按照這樣的三種狀態進行具體構造的,但這不代表就沒有其他狀態的立足之地了,在一些實作中(其實是主流實作,但由于牽扯到虛擬記憶體的概念,所以留到以后講解),還有掛起態等狀態,但不管哪種狀態,他們都是為了作業系統能夠最大化利用計算機資源而抽象出來的,
留幾個小問題做思考:
- 為什么只有從運行態才能轉換到退出態?
- 你能看懂上圖排隊模型嗎?
PCB 是什么東西?
作業系統在管理和控制行程的時候,首先必須知道行程的位置(即行程被加載到哪一塊記憶體了),其次,它還需要知道行程的屬性,如行程 ID,行程狀態等,所以我們就得有一個結構能夠保存這些資訊,
行程控制塊(Process Control Block)就是這么一個結構,行程控制塊會在程式啟動時就被創建出來,

行程控制塊的主要內容及記憶體映像(字丑勿怪)
我們可以看到,PCB 中存盤著行程 ID,暫存器狀態,堆疊指標等重要資訊,這些資訊現在看來非常陌生,但以后隨著你對作業系統理解的加深,你就會理解這些資訊的含義和作用,
圖中還有一個資訊,那就是 PCB 存盤在內核空間——表明只有作業系統有權利更改 PCB 里面的內容,因為 PCB 太重要了,如果其內部資訊被惡意修改,將造成行程意外終止,甚至可能導致作業系統的崩潰,
總結
讓我們來串一下今天的內容:
如果一個程式開始運行,那么作業系統就會為其創建一個行程控制塊,并將其加載到記憶體中,行程控制塊內的「行程狀態」資訊會更改為就緒態,并將行程放入就緒佇列等待分配 CPU,一旦分得 CPU,行程就進入運行態,根據實際情況,還可能因為執行阻塞操作而進入阻塞態,等到程式運行完畢,行程就被作業系統清出記憶體,然后洗掉其行程控制塊,
如果看完上一段,對黑體字的概念還很模糊,那我建議你再慢慢看一遍文章,而且一定要帶上自己的思考,沒有經過思考的閱讀的效率是很低的,
希望你在看完文章之后有所識訓,感謝你的閱讀,我們后會有期!
宣告:原創文章,未經授權,禁止轉載
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/71551.html
標籤:C
上一篇:C語言入門-回圈
