PS:在多進程並發的環境里,雖然從概念上看,有多個進程在同時執行,但在單個CPU下,在任何時刻只能有一個進程處於執行狀態,而其他進程則處於非執行狀態。那么問題來了,我們是如何確定在任意時刻到底由哪個進程執行,哪些不執行呢?這就涉及到進程管理的一個重要組成部分:進程調度,跟隨本篇來一起復習下進程調度吧!
一、進程調度基礎
1.1 進程調度定義

進程調度是操作系統進程管理的一個重要組成部分,其任務是選擇下一個要運行的進程。
1.2 進程調度目標
首先,一般的程序任務分為三種:CPU計算密集型、IO密集型與平衡(計算與IO各半)型,對於不同類型的程序,調度需要達到的目的也有所不同。對於IO密集型,響應時間最重要;對於CPU密集型,則周轉時間最重要;而對於平衡型,進行某種響應和周轉之間的平衡就顯得比較重要。
因此,進程調度的目標就是要達到極小化平均響應時間、極大化系統吞吐率、保持系統各個功能部件均處於繁忙狀態和提供某種貌似公平的機制。
PS:為何說要保持系統各個功能部件均處於繁忙狀態?因為CPU非常昂貴,讓其閑置是一種浪費,因此保持CPU繁忙十分重要。就像生命也非常珍貴,我們只有一只保持學習保持充實的狀態,才算不浪費生命。
二、基本調度算法
2.1 先來先服務算法

先來先服務(FCFS)算法是一種最常見的算法,它是人的本性中的一種公平觀念。其優點就是簡單且實現容易,缺點則是短的工作有可能變得很慢,因為其前面有很長的工作在執行,這樣就會造成用戶的交互式體驗也比較差。
例如排隊辦理業務時,你要辦理的業務只需要幾分鍾就可以辦好,但是你前面的一個人辦理的事情很復雜需要1個小時,這時你需要在他后面等很久,於是你就想到:要是每個人輪流辦理10分鍾事務的話,那該多好!於是就出現了時間片輪轉算法。
2.2 時間片輪轉算法

時間片輪轉是對FCFS算法的一種改進,其主要目的是改善短程序的響應時間,實現方式就是周期性地進行進程切換。時間片輪轉的重點在於時間片的選擇,需要考慮多方因素:如果運行的進程多時,時間片就需要短一些;進程數量少時,時間片就可以適當長一些。因此,時間片的選擇是一個綜合的考慮,權衡各方利益,進行適當折中。
但是,時間片輪轉的系統響應時間也不一定總是比FCFS的響應時間短。時間片輪轉是一種大鍋飯的做法,但是現實生活中卻是走的“一部分人先富,先富帶動后富”的路線。例如,如果有30個任務,其中一個任務只需要1秒時間執行,而其他29個任務需要30秒鍾執行,如果因為某種原因,這個只要1秒鍾的任務排在另外29個任務的后面輪轉,則它需要等待29秒鍾才能執行(假定時間片為1秒)。於是,這個任務的響應時間和交互體驗就變得非常差。因此,短任務優先算法被提出。
2.3 短任務優先算法
短任務優先算法的核心是所有的任務並不都一樣,而是有優先級的區分。具體來說,就是短任務的優先級比長任務的高,而我們總是安排優先級高的任務先運行。
短任務優先算法又分為兩種類型:一種是非搶占式,一種是搶占式。非搶占式當已經在CPU上運行的任務結束或阻塞時,從候選任務中選擇執行時間最短的進程來執行。而搶占式則是每增加一個新的進程就需要對所有進程(包括正在CPU上運行的進程)進行檢查,誰的時間短就運行誰。
由於短任務優先總是運行需要執行時間最短的程序,因此其系統平均響應時間在以上幾種算法中是最優的,這也是短任務優先算法的優點。但短任務優先算法也有缺點:一是可能造成長任務無法得到CPU時間從而導致“肌餓”。二是如何知道每個進程還需要運轉多久?於是為了解決第一個缺點,優先級調度算法被提出。而第二個缺點則可以采取一些啟發式的方法來進行估算,目前很多的人工智能算法都可以做這個事。
2.4 優先級調度算法

優先級調度算法給每個進程賦予一個優先級,每次需要進程切換時,找一個優先級最高的進程進行調度。這樣如果賦予長進程一個高優先級,則該進程就不會再“飢餓”。事實上,短任務優先算法本身就是一種優先級調度,只不過它給予短進程更高的優先級而已。
該算法的優點在於可以賦予重要的進程以高優先級以確保重要任務能夠得到CPU時間,其缺點則有二:一是低優先級的進程可能會“飢餓”,二是響應時間無法保證。第一個缺點可以通過動態地調節任務的優先級解決,例如一個進程如果等待時間過長,其優先級將因持續提升而超越其他進程的優先級,從而得到CPU時間。第二個缺點可以通過將一個進程優先級設置為最高來解決,但即使將優先級設置為最高,但如果每個人都將自己的進程優先級設置為最高,其響應時間還是無法保證。
2.5 混合調度算法
之前的算法都存在一定缺點,那么可否有一個算法混合他們的優點,摒棄它們的缺點,這就是所謂的混合調度算法。混合調度算法將所有進程分為不同的大類,每個大類為一個優先級。如果兩個進程處於不同的大類,則處於高優先級大類的進程優先執行;如果處於同一個大類,則采用時間片輪轉算法來執行。混合調度算法的示意圖如下圖所示:

2.5 進程調度的過程

三、調度異常之優先級倒掛
3.1 何為優先級倒掛
優先級倒掛指的是一個低優先級任務持有一個被高優先級任務所需要的共享資源。這樣高優先級任務因為資源缺乏而處於受阻狀態,一直到低優先級任務釋放資源為止。這樣實際上造成了這兩個任務的優先級倒掛。
3.2 優先級倒掛的表現形式
(1)不持有資源的低優先級進程阻礙需要資源的高優先級進程的執行;
(2)持有資源的優先級進程阻礙需要資源的高優先級進程的執行;
3.3 優先級倒掛的預防辦法
(1)針對第一種形式,可以使用中斷禁止的方法,其核心是通過禁止中斷來保護臨界區。
(2)針對第二種形式,不能讓低優先級進程持有高優先級進程所需要的資源,則可以通過優先級上限和優先級繼承來實現。
優先級倒掛問題,后面會詳細學習,到時再詳細說說。當然,欲知后事如何,請看下回分解。

參考資料

鄒恆明,《操作系統之哲學原理》,機械工業出版社
