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)立即搶佔的優先權調度算法.

在這種調度策略中,要求操作系統具有快速響應外部時間中斷的能力.一旦出現外部中斷,只要當前任務未處於臨界區便立即剝奪當前任務的執行,把處理機分配給請求中斷的緊迫任務,實時進程調度,實時進程搶佔當前。
發佈了46 篇原創文章 · 獲贊 31 · 訪問量 18萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章