1. 程式人生 > 實用技巧 >排程演算法(待完善)

排程演算法(待完善)

一 . 程序排程演算法

程序排程演算法也稱 CPU 排程演算法,畢竟程序是由 CPU 排程的。

當 CPU 空閒時,作業系統就選擇記憶體中的某個「就緒狀態」的程序,並給其分配 CPU。

什麼時候會發生 CPU 排程呢?通常有以下情況:

  1. 當程序從執行狀態轉到等待狀態;

  2. 當程序從執行狀態轉到就緒狀態;

  3. 當程序從等待狀態轉到就緒狀態;

  4. 當程序從執行狀態轉到終止狀態;

其中發生在 1 和 4 兩種情況下的排程稱為「非搶佔式排程」,2 和 3 兩種情況下發生的排程稱為「搶佔式排程」。

非搶佔式的意思就是,當程序正在執行時,它就會一直執行,直到該程序完成或發生某個事件而被阻塞時,才會把 CPU 讓給其他程序。

而搶佔式排程,顧名思義就是程序正在執行的時,可以被打斷,使其把 CPU 讓給其他程序。那搶佔的原則一般有三種,分別是時間片原則、優先權原則、短作業優先原則。

你可能會好奇為什麼第 3 種情況也會發生 CPU 排程呢?假設有一個程序是處於等待狀態的,但是它的優先順序比較高,如果該程序等待的事件發生了,它就會轉到就緒狀態,一旦它轉到就緒狀態,如果我們的排程演算法是以優先順序來進行排程的,那麼它就會立馬搶佔正在執行的程序,所以這個時候就會發生 CPU 排程。

那第 2 種狀態通常是時間片到的情況,因為時間片到了就會發生中斷,於是就會搶佔正在執行的程序,從而佔用 CPU。

排程演算法影響的是等待時間(程序在就緒佇列中等待排程的時間總和),而不能影響程序真在使用 CPU 的時間和 I/O 時間。

接下來,說說常見的排程演算法:

  • 先來先服務排程演算法

  • 最短作業優先排程演算法

  • 高響應比優先排程演算法

  • 時間片輪轉排程演算法

  • 最高優先順序排程演算法

  • 多級反饋佇列排程演算法

先來先服務排程演算法

最簡單的一個排程演算法,就是非搶佔式的先來先服務(*First Come First Severd, FCFS*)演算法了。

                       FCFS 排程演算法

顧名思義,先來後到,每次從就緒佇列選擇最先進入佇列的程序,然後一直執行,直到程序退出或被阻塞,才會繼續從佇列中選擇第一個程序接著執行。

這似乎很公平,但是當一個長作業先運行了,那麼後面的短作業等待的時間就會很長,不利於短作業。

FCFS 對長作業有利,適用於 CPU 繁忙型作業的系統,而不適用於 I/O 繁忙型作業的系統。

最短作業優先排程演算法

最短作業優先(*Shortest Job First, SJF*)排程演算法同樣也是顧名思義,它會優先選擇執行時間最短的程序來執行,這有助於提高系統的吞吐量。

                            SJF 排程演算法

這顯然對長作業不利,很容易造成一種極端現象。

比如,一個長作業在就緒佇列等待執行,而這個就緒佇列有非常多的短作業,那麼就會使得長作業不斷的往後推,週轉時間變長,致使長作業長期不會被執行。

高響應比優先排程演算法

前面的「先來先服務排程演算法」和「最短作業優先排程演算法」都沒有很好的權衡短作業和長作業。

那麼,高響應比優先 (*Highest Response Ratio Next, HRRN*)排程演算法主要是權衡了短作業和長作業。

每次進行程序排程時,先計算「響應比優先順序」,然後把「響應比優先順序」最高的程序投入執行,「響應比優先順序」的計算公式:

從上面的公式,可以發現:

  • 如果兩個程序的「等待時間」相同時,「要求的服務時間」越短,「響應比」就越高,這樣短作業的程序容易被選中執行;

  • 如果兩個程序「要求的服務時間」相同時,「等待時間」越長,「響應比」就越高,這就兼顧到了長作業程序,因為程序的響應比可以隨時間等待的增加而提高,當其等待時間足夠長時,其響應比便可以升到很高,從而獲得執行的機會;

時間片輪轉排程演算法

最古老、最簡單、最公平且使用最廣的演算法就是時間片輪轉(*Round Robin, RR*)排程演算法

                  RR 排程演算法

每個程序被分配一個時間段,稱為時間片(*Quantum*),即允許該程序在該時間段中執行。

  • 如果時間片用完,程序還在執行,那麼將會把此程序從 CPU 釋放出來,並把 CPU 分配另外一個程序;

  • 如果該程序在時間片結束前阻塞或結束,則 CPU 立即進行切換;

另外,時間片的長度就是一個很關鍵的點:

  • 如果時間片設得太短會導致過多的程序上下文切換,降低了 CPU 效率;

  • 如果設得太長又可能引起對短作業程序的響應時間變長;

通常時間片設為 20ms~50ms 通常是一個比較合理的折中值。

最高優先順序排程演算法

前面的「時間片輪轉演算法」做了個假設,即讓所有的程序同等重要,也不偏袒誰,大家的執行時間都一樣。

但是,對於多使用者計算機系統就有不同的看法了,它們希望排程是有優先順序的,即希望排程程式能從就緒佇列中選擇最高優先順序的程序進行執行,這稱為最高優先順序(*Highest Priority First,HPF*)排程演算法

程序的優先順序可以分為,靜態優先順序或動態優先順序:

  • 靜態優先順序:建立程序時候,就已經確定了優先順序了,然後整個執行時間優先順序都不會變化;

  • 動態優先順序:根據程序的動態變化調整優先順序,比如如果程序執行時間增加,則降低其優先順序,如果程序等待時間(就緒佇列的等待時間)增加,則升高其優先順序,也就是隨著時間的推移增加等待程序的優先順序

該演算法也有兩種處理優先順序高的方法,非搶佔式和搶佔式:

  • 非搶佔式:當就緒佇列中出現優先順序高的程序,執行完當前程序,再選擇優先順序高的程序。

  • 搶佔式:當就緒佇列中出現優先順序高的程序,當前程序掛起,排程優先順序高的程序執行。

但是依然有缺點,可能會導致低優先順序的程序永遠不會執行。

多級反饋佇列排程演算法

多級反饋佇列(*Multilevel Feedback Queue*)排程演算法是「時間片輪轉演算法」和「最高優先順序演算法」的綜合和發展。

顧名思義:

  • 「多級」表示有多個佇列,每個佇列優先順序從高到低,同時優先順序越高時間片越短。

  • 「反饋」表示如果有新的程序加入優先順序高的佇列時,立刻停止當前正在執行的程序,轉而去執行優先順序高的佇列;

多級反饋佇列

來看看,它是如何工作的:

  • 設定了多個佇列,賦予每個佇列不同的優先順序,每個佇列優先順序從高到低,同時優先順序越高時間片越短

  • 新的程序會被放入到第一級佇列的末尾,按先來先服務的原則排隊等待被排程,如果在第一級佇列規定的時間片沒執行完成,則將其轉入到第二級佇列的末尾,以此類推,直至完成;

  • 當較高優先順序的佇列為空,才排程較低優先順序的佇列中的程序執行。如果程序執行時,有新程序進入較高優先順序的佇列,則停止當前執行的程序並將其移入到原佇列末尾,接著讓較高優先順序的程序執行;

可以發現,對於短作業可能可以在第一級佇列很快被處理完。對於長作業,如果在第一級佇列處理不完,可以移入下次佇列等待被執行,雖然等待的時間變長了,但是執行時間也會更長了,所以該演算法很好的兼顧了長短作業,同時有較好的響應時間。


二.記憶體頁面置換演算法

後面兩章後補