這是操作系統系列第 2 篇。 如果你想知道操作系統每天都在做些什麼,那就打開你的資源監視器: 資源監視器截圖,Windows 10 單獨通過這一張圖,我們就能夠總結出操作系統的幾個重要功能: 進程管理 線程管理 記憶體管理 I/O 管理 (包含了磁碟調度) 文件管理 ,這一功能在圖裡沒有表現出來,但我 ...
這是操作系統系列第 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,進程就進入運行態,根據實際情況,還可能因為執行阻塞操作而進入阻塞態,等到程式運行完畢,進程就被操作系統清出記憶體,然後刪除其進程式控制制塊。
如果看完上一段,對黑體字的概念還很模糊,那我建議你再慢慢看一遍文章,而且一定要帶上自己的思考,沒有經過思考的閱讀的效率是很低的。
希望你在看完文章之後有所收穫。感謝你的閱讀,我們後會有期!
聲明:原創文章,未經授權,禁止轉載