1. 程式人生 > >LINUX 程序排程演算法

LINUX 程序排程演算法

程序排程:

  無論是在批處理系統還是分時系統中,使用者程序數一般都多於處理機數、這將導致它們互相爭奪處理機。另外,系統程序也同樣需要使用處理機

這就要求程序排程程式按一定的策略,動態地把處理機分配給處於就緒佇列中的某一個程序,以使之執行。

一、程序的基本狀態及狀態間的轉換:

  1.等待態:等待某個事件的完成;

  2.就緒態:等待系統分配處理器以便執行;

  3.執行態:佔有處理器正在執行。

   執行態→等待態 往往是由於等待外設,等待主存等資源分配或等待人工干預而引起的。    等待態→就緒態 則是等待的條件已滿足,只需分配到處理器後就能執行    執行態→就緒態 不是由於自身原因,而是由外界原因使執行狀態的程序讓出處理器,這時候就變成就緒態。例如時間片用完,或有更高優先順序的程序來搶佔處理器等。
   就緒態→執行態 系統按某種策略選中就緒佇列中的一個程序佔用處理器,此時就變成了執行態

二、處理機

  高階、中級和低階排程作業從提交開始直到完成,往往要經歷下述三級排程:   高階排程:(High-Level Scheduling)又稱為作業排程,它決定把後備作業調入記憶體執行;   低階排程:(Low-Level Scheduling)又稱為程序排程,它決定把就緒佇列的某程序獲得CPU;   中級排程:(Intermediate-Level Scheduling)又稱為在虛擬儲存器中引入,在內、外存對換區進行程序對換。

三、程序排程的演算法及思想

1.先來先服務排程演算法

  先來先服務(FCFS)排程演算法是一種最簡單的排程演算法,該演算法既可用於作業排程,也可用於程序排程。當在作業排程中採用該演算法時,

每次排程都是從後備作業佇列中選擇一個或多個最先進入該佇列的作業,將它們調入記憶體,為它們分配資源、建立程序,然後放入就緒

佇列。在程序排程中採用FCFS演算法時,則每次排程是從就緒佇列中選擇一個最先進入該佇列的程序,為之分配處理機,使之投入執行。

該程序一直執行到完成或發生某事件而阻塞後才放棄處理機。

來看一個例子,假設有三個程序和它們各自執行時間(以毫秒為單位)如下表: 那麼如果三個程序按照P1, P2, P3的順序啟動的話,按照先到先服務的排程演算法,執行過程如下:
  平均等待時間就是(0 + 24 + 27) / 3 = 17毫秒。FCFS演算法是非搶佔式的,一旦核心將CPU分配給一個程序就不會被釋放 了,除非程序結束或者請求I/O阻塞。這也是我們之前學習的多工系統的特點。

2、基於優先順序排程 (Priority Scheduling)

  在優先順序排程演算法中,每個程序都關聯一個優先順序,核心將CPU分配給最高優先順序的程序。具有相同優先順序的程序,按照 先來先服務的原則進行排程。假設程序的執行時間和優先順序如下,並且這些程序同時存在於記憶體中時,核心基於優先順序的 排程過程如下:   採取基於優先順序排程演算法要考慮程序餓死的問題,因為高優先順序的程序總是會被優先排程,具有低優先順序的程序可能永遠 都不會被核心排程執行。Aging是對於這個問題的一個解決方案,所謂Aging就是指逐漸提高系統中長時間等待的程序的 優先順序。比如如果優先順序的範圍從127到0(127表示最低優先順序),那麼我們可以每15分鐘將等待程序的優先順序加1。最終 經過一段時間,即便是擁有最低優先順序127的程序也會變成系統中最高優先順序的程序,從而被執行。   優先順序排程可以搶佔式或者非搶佔式的。當一個程序在Ready佇列中時,核心將它的優先順序與正在CPU上執行的程序的優先順序 進行比較。當發現這個新程序的優先順序比正在執行的程序高時:對於搶佔式核心,新程序會搶佔CPU,之前正在執行的程序 轉入Ready佇列;對於非搶佔式核心,新程序只會被放置在Ready佇列的頭部,不會搶佔正在執行的程序。

3、短程序優先(SCBF--Shortest CPU Burst First)

  最短CPU執行期優先排程演算法(SCBF--Shortest CPU Burst First) 該演算法從就緒佇列中選出下一個“CPU執行期最短”的程序,為之分配處理機 最短作業優先排程是優先順序排程的特例。在優先順序排程中我們根據程序的優先順序來進行排程,在最短作業優先排程中我們 根據作業的執行時間長短來排程。通過下面的例子來看看SJF是怎樣排程的。   程序1首先執行了1毫秒,當執行時間更短的程序2進入Ready佇列時發生搶佔。程序3在程序2執行1毫秒後到來,但是程序3的 執行時間比程序2長。同理程序4的到來也沒法搶佔程序2,所以程序2可以一直執行到結束。之後是執行時間第二短的程序4 執行,最後是程序1(要看剩餘執行時間,還剩7毫秒)和程序3。   SJF排程是最優的排程,但難點在於如何預測程序的執行時間(Burst Time)。對於批處理系統中的長期排程來說,可以將使用者 提交程序時輸入的執行時間上限作為依據。但對於短期排程來說,沒有辦法能夠提前得知下一個要被分配CPU的程序的執行 時間長短。我們只能通過歷史資料來進行預測,公式如下: α可以取0.5,公式前半部分表示最近一次Burst Time,而後半部分表示過去歷史平均的Burst Time。 該演算法雖可獲得較好的排程效能,但難以準確地知道下一個CPU執行期,而只能根據每一個程序的執行歷史來預測。

4、輪轉法 (Round-Robin Scheduling) (RR)

  前幾種演算法主要用於批處理系統中,不能作為分時系統中的主排程演算法,在分時系統中,都採用時間片輪轉法。 簡單輪轉法:系統將所有就緒程序按FIFO規則排隊,按一定的時間間隔把處理機分配給佇列中的程序。這樣,就緒 佇列中所有程序均可獲得一個時間片的處理機而執行。多級佇列方法:將系統中所有程序分成若干類,每類為一級。   RR排程演算法轉為分時系統設計,它與FCFS很像,但是加入了搶佔。具體排程過程是:核心從Ready佇列中選取第一個程序, 將CPU資源分配給它,並且設定一個定時器在一個時間片後中斷該程序,排程Ready佇列中的下一程序。很明顯,RR排程 演算法是搶佔式的,並且在該演算法的排程下,沒有一個程序能夠連續佔用CPU超過一個時間片,從而達到了分時的目的。 來看下面的例子,假設一個時間片的長度為4毫秒:

5、高響應比優先排程演算法

  (1) 如果作業的等待時間相同,則要求服務的時間愈短,其優先權愈高,因而該演算法有利於短作業.   (2) 當要求服務的時間相同時,作業的優先權決定於其等待時間,等待時間愈長,其優先權愈高,因而它實現的是先來先服務.   (3) 對於長作業,作業的優先順序可以隨等待時間的增加而提高,當其等待時間足夠長時,其優先順序便可升到很高, 從而也可獲得處理機.   該演算法照顧了短作業,且不會使長作業長期得不到服務

6、搶佔式排程演算法

1. 非搶佔式排程演算法

為每一個被控物件建立一個實時任務並將它們排列成一輪轉佇列,排程程式每次選擇佇列中的第一個任務投入執行.該任務完成後便把它掛在輪轉佇列的隊尾等待下次排程執行.

2. 非搶佔式優先排程演算法.

實時任務到達時,把他們安排在就緒佇列的對首,等待當前任務自我終止或執行完成後才能被排程執行.

3. 搶佔式排程演算法

1)基於時鐘中斷的搶佔式優先權排程演算法.

實時任務到達後,如果該任務的優先級別高於當前任務的優先順序並不立即搶佔當前任務的處理機,而是等到時鐘中斷到來時,排程程式才剝奪當前任務的執行,將處理機分配給新到的高優先權任務.

2)立即搶佔的優先權排程演算法.

在這種排程策略中,要求作業系統具有快速響應外部時間中斷的能力.一旦出現外部中斷,只要當前任務未處於臨界區便立即剝奪當前任務的執行,把處理機分配給請求中斷的緊迫任務,實時程序排程,實時程序搶佔當前。