1. 程式人生 > >作業系統學習(二)--程序描述和執行

作業系統學習(二)--程序描述和執行

這是作業系統系列第 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 代表了程序

要注意的是,就緒態,執行態和阻塞態提供了一種描述程序行為的系統方法,指導了作業系統的實現,許多實際的作業系統都是按照這樣的三種狀態進行具體構造的。但這不代表就沒有其他狀態的立足之地了,在一些實現中(其實是主流實現,但由於牽扯到虛擬記憶體的概念,所以留到以後講解),還有掛起態等狀態。但不管哪種狀態,他們都是為了作業系統能夠最大化利用計算機資源而抽象出來的。

留幾個小問題做思考:

  1. 為什麼只有從執行態才能轉換到退出態?
  2. 你能看懂上圖排隊模型嗎?

PCB 是什麼東西?

作業系統在管理和控制程序的時候,首先必須知道程序的位置(即程序被載入到哪一塊記憶體了),其次,它還需要知道程序的屬性,如程序 ID,程序狀態等,所以我們就得有一個結構能夠儲存這些資訊。

程序控制塊(Process Control Block)就是這麼一個結構。程序控制塊會在程式啟動時就被創建出來。

程序控制塊的主要內容及記憶體映像(字醜勿怪)

我們可以看到,PCB 中儲存著程序 ID,暫存器狀態,棧指標等重要資訊,這些資訊現在看來非常陌生,但以後隨著你對作業系統理解的加深,你就會理解這些資訊的含義和作用。

圖中還有一個資訊,那就是 PCB 儲存在核心空間——表明只有作業系統有權利更改 PCB 裡面的內容。因為 PCB 太重要了,如果其內部資訊被惡意修改,將造成程序意外終止,甚至可能導致作業系統的崩潰。

總結

讓我們來串一下今天的內容:

如果一個程式開始執行,那麼作業系統就會為其建立一個程序控制塊,並將其載入到記憶體中,程序控制塊內的「程序狀態」資訊會更改為就緒態,並將程序放入就緒佇列等待分配 CPU。一旦分得 CPU,程序就進入執行態,根據實際情況,還可能因為執行阻塞操作而進入阻塞態,等到程式執行完畢,程序就被作業系統清出記憶體,然後刪除其程序控制塊。

如果看完上一段,對黑體字的概念還很模糊,那我建議你再慢慢看一遍文章,而且一定要帶上自己的思考,沒有經過思考的閱讀的效率是很低的。

希望你在看完文章之後有所收穫。感謝你的閱讀,我們後會有期!

宣告:原創文章,未經授權,禁止轉