1. 程式人生 > >作業系統精髓與設計原理(原書第6版)——學習筆記(12)

作業系統精髓與設計原理(原書第6版)——學習筆記(12)



3.2.3 五狀態模型

如果所有程序都做好了執行準備,則圖3.5b所給出的排隊規則是有效的。佇列是“先進先出”(FIFO)的表,對於可執行的程序處理器以一種輪轉方式操作(依次給佇列中的每個程序一定的執行時間,然後程序返回佇列,阻塞情況除外)。但是,即使對前面描述的簡單例子,這個實現都是不合適的:存在著一些處於非執行狀態但已經就緒等待執行的程序,而同時存在的另外的一些處於阻塞狀態等待I/O操作結束的程序。因此,如果使用單個佇列,排程器不能只考慮選擇佇列中最老的程序,相反,它應該掃描這個列表,查詢那些未被阻塞且在佇列中時間最長的程序。

解決這種情況的一種比較自然的方法是將非執行狀態分成兩個狀態:就緒(

ready)和阻塞(blocked),如圖3.6所示。新圖中的5種狀態如下:

  • 執行態:該程序正在執行。

  • 就緒態:程序做好準備,只要有機會就開始執行。

  • 阻塞/等待態:程序在某些事件發生前不能執行,如I/O操作完成。

  • 新建態:剛剛建立的程序,作業系統還沒有把它加入到可執行程序組中。通常是程序控制住塊已經建立但還沒有載入到記憶體中的新程序。

  • 退出態:作業系統從可執行程序組中釋放出的程序,或者是因為它自身停止了,或者是因為某種原因被取消。

新建態對應於剛剛定義的程序。例如,如果一個新使用者試圖登入到分時系統中,或者一個新的批作業唄提交執行,那麼作業系統可以分兩步定義新程序。首先,作業系統執行一些必需的輔助工作,將識別符號關聯到程序,分配和建立管理程序所需要的所有表。此時,程序處於新建狀態,這意味著作業系統已經執行了建立程序的必需動作,但還沒有執行程序。例如作業系統可能基於效能或記憶體侷限性的原因,限制系統中的程序數量。當程序處於新建態時,作業系統所需要的關於該程序的資訊儲存在記憶體中的程序表中,但程序自身還未進入記憶體

,就是即將執行的程式程式碼不在記憶體中,也沒有為與這個程式相關的資料分配空間。當程序處於新建態時,程式保留在外存中,通常是磁碟中。

程序退出系統也分兩步。首先,當程序到達一個自然結束點時,由於出現不可恢復的錯誤而取消時,或當具有相應許可權的另一個程序取消該程序時,程序被終止;終止使程序轉換到退出態,此時,程序不在被執行,與作業相關的表和其他資訊臨時被作業系統保留起來,這給輔助程式或支援程式提供所需資訊的時間。一個實用程式為了分析效能和利用率,可能需要提取程序的歷史資訊,一旦這些程式提取了所需的資訊,作業系統就不在需要保留任何與該程序相關的資料,該程序將從系統中刪除。

3.6顯示了導致程序狀態轉換的事件型別。可能的轉換如下:

  •  ----->新建:建立執行一個程式的新程序。這個事件在表3.1中列出的原因都會發生。

  • 新建 -----> 就緒:作業系統準備好再接納一個程序時,把一個程序從新建態轉換到就緒態。大多數系統基於現有的程序數或分配給現有程序的虛擬記憶體數量設定一些限制,以確保不會因為活躍程序的數量過多而導致系統的效能下降。

  • 就緒  ---->執行:這轉換最常見的原因是,正在執行的程序達到了“允許不中斷執行”的最大時間段;實際上所有多道程式作業系統都實行了這類時間限定。這類轉換還有其他原因,例如作業系統給不同的程序分配不同的優先順序,但這不是在所有系統中都實現了。假設,程序A在一個給定的優先順序執行,且具有更高優先順序的程序B正處於阻塞態。如果作業系統知道程序B等待的事件已經發生,則將B 轉換到就緒態,然後因為優先順序的原因中斷程序A的執行,將處理器分派給程序B,我們說作業系統搶佔了程序A。最後一種情況是,程序自願釋放對處理器的控制,例如一個週期性地進行記賬和維護的後臺程序。

  • 執行-->阻塞:如果程序請求它必須等待的某些事件,則進入阻塞態。對作業系統的請求通常以系統服務呼叫的形式發出,也就是說,正在執行的程式請求呼叫作業系統中一部分程式碼所發生的過程。當程序相互通訊,一個程序等待另一個程序提供輸入時,或者等待來自另一個程序的資訊時,都可能被阻塞。

  • 阻塞 ---> 就緒:當所等待的事件發生時,處於阻塞態的程序轉換到就緒態。

  • 就緒--->退出:為了清楚起見,狀態圖中沒有表示這種轉換。在某些系統中,父程序可以在任何時候終止一個子程序。如果一個父程序終止,與該父程序相關的所有子程序都將被終止。

  • 阻塞-->退出:前面一項提供了註釋。

3.7顯示了程序在狀態間的轉換,圖3.8a給出了可能實現的排隊規則,有兩個佇列:就緒佇列和阻塞佇列。進入系統的每個程序被放置在就緒佇列中,當作業系統選擇另一個程序執行時,將從就緒佇列中選擇。對於沒有優先順序的方案,這可以是一個簡單的先進先出佇列。當一個正在執行的程序被移出處理器時,它根據情況或者被終止,或者被放置在就緒或阻塞佇列中。最後,當一個事件發生是,所有位於阻塞佇列中等待這個事件的程序都被轉換到就緒佇列中。

在大型作業系統中,佇列中可能有幾百甚至幾千個程序,因此,擁有多個佇列將會很有效,一個事件可以對應一個佇列。那麼,當事件發生時,相應對壘中的所有程序都轉換到就緒態(圖3.8b)。

還有一種改進,如果按照優先順序方案分派程序,維護多個就緒對了(每個優先順序一個佇列)將會帶來很多的便利。作業系統可以很容易的確定哪個就緒程序具有最高的優先順序且等待時間最長。