這是作業系統系列第 2 篇。
如果你想知道作業系統每天都在做些什麼,那就開啟你的資源監視器:
資源監視器截圖,windows 10
單獨通過這一張圖,我們就能夠總結出作業系統的幾個重要功能:
為什麼我要從程序開始講起呢?
原因很簡單,我們每天使用計算機,包括手機和電腦,本質上是使用執行在其作業系統上的應用程式。對於我們來講,作業系統最為直觀的功能就是程序管理,所以,讓我們從程序管理入手,由表及裡,一步步深挖作業系統的本質。
我在第一篇文章裡簡單提到了程序這一概念,這裡再詳細講一下,加深理解。
作業系統的設計從根本上來說是為了迎合使用者需求,對個人使用者來說,需求就是在一台計算機上執行多個應用程式,以滿足生活和工作的需要。但應用程式這麼多,不可能讓每乙個程式占用乙個 cpu 核心啊,因為 cpu 核心是有限的,人的需求是無限的。
所以作業系統就需要將無限(誇張一下)的應用程式,分配到有限的 cpu 上去。
當我們開啟一堆程式時,這些程式就會被載入到記憶體上,為了讓這些執行的程式與沒有開啟的程式作區分,我們創造了程序(process)這個名詞。所以,程序就是對執行的程式的一種抽象,具有動態性。程序管理其實就是作業系統通過某種方式,管理我們已經開啟的程式。
注:為了簡化後面的討論,我們假設所說的計算機是單核的。
講到程序,我們必然需要了解程序狀態,想要了解程序的狀態,我們就得從程序的角度,看一看程序的一生會發生什麼。
首先,使用者開啟某個應用程式,這個程式就處於新建態(new),這個時候作業系統還沒有為這個程式做好準備工作,這個程序自身還沒有進入記憶體,可能還留在磁碟裡。
等到這個程序被載入進記憶體,就代表它已經準備好執行了,但因為 cpu 資源正被別的程序占用,它只能等待作業系統為它分配 cpu。這個狀態稱為就緒態(ready)。
在就緒態一段時間後,總會分配到 cpu 資源,一旦程序開始執行,它就進入了執行態(running)。
有的程序可能會執行某些阻塞操作,就拿 i/o 操作來舉例子,執行操作後,程序需要等待 i/o 操作完成,第一篇文章講過,程序在這段時間內是無法使用 cpu 的,如果讓它繼續占用 cpu,就造成了資源浪費。所以作業系統會剝奪它的 cpu 使用權,並把它放在阻塞態。等到i/o 操作結束後,再將其放入就緒態。
還有最後一種狀態——退出態,顧名思義,程序終止後,就會進入退出態,這個程序可能還沒有從記憶體中清理出去。等到程序完全退出記憶體,程序的一生就徹底結束了。
綜合以上的討論,我們得到了程序的 5 種狀態:
細心的讀者可能會發現,執行態到阻塞態,以及阻塞態到就緒態之間的箭頭是單向的。為什麼?
先來看看執行態和阻塞態。回憶一下,乙個程序處於阻塞態代表什麼?(希望你看到這確實停下來思考了)
乙個程序處於阻塞態,代表程序執行了某個阻塞操作,正在等待操作的結果。也就是說,處於阻塞態的程序沒有使用 cpu 的能力,所以即使給了它 cpu 它也沒辦法執行,自然無法進入執行狀態。所以從阻塞態是無法直接跳到執行態的。
再來說說就緒態和阻塞態。如果乙個程序位於就緒態,說明它現在沒有使用 cpu,所以更不可能執行阻塞操作。因此從就緒態也不能直接跳轉到阻塞態。
結合剛剛的解釋,我們來看看乙個簡單的程序的排隊模型:
圖中的 abcdef 代表了程序
要注意的是,就緒態,執行態和阻塞態提供了一種描述程序行為的系統方法,指導了作業系統的實現,許多實際的作業系統都是按照這樣的三種狀態進行具體構造的。但這不代表就沒有其他狀態的立足之地了,在一些實現中(其實是主流實現,但由於牽扯到虛擬記憶體的概念,所以留到以後講解),還有掛起態等狀態。但不管哪種狀態,他們都是為了作業系統能夠最大化利用計算機資源而抽象出來的。
留幾個小問題做思考:
為什麼只有從執行態才能轉換到退出態?
你能看懂上圖排隊模型嗎?
作業系統在管理和控制程序的時候,首先必須知道程序的位置(即程序被載入到哪一塊記憶體了),其次,它還需要知道程序的屬性,如程序 id,程序狀態等,所以我們就得有乙個結構能夠儲存這些資訊。
程序控制塊(process control block)就是這麼乙個結構。程序控制塊會在程式啟動時就被建立出來。
程序控制塊的主要內容及記憶體映像(字醜勿怪)
我們可以看到,pcb 中儲存著程序 id,暫存器狀態,棧指標等重要資訊,這些資訊現在看來非常陌生,但以後隨著你對作業系統理解的加深,你就會理解這些資訊的含義和作用。
圖中還有乙個資訊,那就是 pcb 儲存在核心空間——表明只有作業系統有權利更改 pcb 裡面的內容。因為 pcb 太重要了,如果其內部資訊被惡意修改,將造成程序意外終止,甚至可能導致作業系統的崩潰。
讓我們來串一下今天的內容:
如果乙個程式開始執行,那麼作業系統就會為其建立乙個程序控制塊,並將其載入到記憶體中,程序控制塊內的「程序狀態」資訊會更改為就緒態,並將程序放入就緒佇列等待分配 cpu。一旦分得 cpu,程序就進入執行態,根據實際情況,還可能因為執行阻塞操作而進入阻塞態,等到程式執行完畢,程序就被作業系統清出記憶體,然後刪除其程序控制塊。
作業系統學習筆記(二) 程序管理(1)
今天進行作業系統第二章的複習。這章內容及其重要,是考試以及學習過程中的重點。橘黃色為重要內容 一 引入程序 在上一講中我們提到多道程式設計。多道程式設計特點 多道程式同時駐留記憶體 在巨集觀上並行執行 在微觀上序列執行 多道程式設計問題 執行過程 間斷性 執行環境 封閉性 執行結果 再現性 引入程序...
作業系統學習(二)
程式的可併發執行 程序的定義與特徵 程序的狀態 程序的掛起狀態 程序控制塊 程序的組織形式 程序控制 程序的建立 程序終止 程序的終止過程 引起程序阻塞和喚醒的事件 中斷型別分為如下兩大類 按中斷功能分類 引入,前驅圖 定義 前驅圖是乙個又向無迴圈圖,可用來描述程式段或程序之間的先後次序關係。前趨圖...
作業系統 程序描述
作業系統為了管理程序和資源,必須掌握每個程序和資源的當前狀態。最普遍採用的一張方法是 作業系統管理並維護其管理的每個實體的資訊表。大致可以分為四類 記憶體,i o,檔案,程序。以後的學習中將會著重對這四部分內容學習。如上圖所示,作業系統會為如上實體維護資訊表,在此目前只研究程序,其餘的在以後的學習會...