作業系統排程演算法

pengfoo發表於2012-02-28
 

5.3.1基本原理

從前面我們可以看到,程式執行需要各種各樣的系統資源,如記憶體、檔案、印表機和最寶貴的CPU等等,所以說呢,排程的實質就是資源的分配。系統通過不同的排程演算法(Scheduling Algorithm)來實現這種資源的分配。通常來說,選擇什麼樣的排程演算法取決於的資源分配的策略(Scheduling Policy),我們不準備在這裡詳細說明各種排程演算法,只說明與Linux排程相關的幾種演算法及這些演算法的原理。

一個好的排程演算法應當考慮以下幾個方面:

(1)公平:保證每個程式得到合理的CPU時間。

(2)高效:使CPU保持忙碌狀態,即總是有程式在CPU上執行。

(3)響應時間:使互動使用者的響應時間儘可能短。

(4)週轉時間:使批處理使用者等待輸出的時間儘可能短。

(5)吞吐量:使單位時間內處理的程式數量儘可能多。

很顯然,這5個目標不可能同時達到,所以,不同的作業系統會在這幾個方面中作出相應的取捨,從而確定自己的排程演算法,例如UNIX採用動態優先數排程、5.3BSD採用多級反饋佇列排程、Windows採用搶先多工排程等等。

下面來了解一下主要的排程演算法及其基本原理:

1.時間片輪轉排程演算法

時間片(Time Slice)就是分配給程式執行的一段時間。

在分時系統中,為了保證人機互動的及時性,系統使每個程式依次地按時間片輪流的方式執行,此時即應採用時間片輪轉法進行排程。在通常的輪轉法中,系統將所有的可執行(即就緒)程式按先來先服務的原則,排成一個佇列,每次排程時把CPU分配給隊首程式,並令其執行一個時間片。時間片的大小從幾ms到幾百ms不等。當執行的時間片用完時,系統發出訊號,通知排程程式,排程程式便據此訊號來停止該程式的執行,並將它送到執行佇列的末尾,等待下一次執行;然後,把處理機分配給就緒佇列中新的隊首程式,同時也讓它執行一個時間片。這樣就可以保證執行佇列中的所有程式,在一個給定的時間(人所能接受的等待時間)內,均能獲得一時間片的處理機執行時間。

2.優先權排程演算法

為了照顧到緊迫型程式在進入系統後便能獲得優先處理,引入了最高優先權排程演算法。當將該演算法用於程式排程時,系統將把處理機分配給執行佇列中優先權最高的程式,這時,又可進一步把該演算法分成兩種方式:

(1) 非搶佔式優先權演算法(又稱不可剝奪排程:Nonpreemptive Scheduling)

在這種方式下,系統一旦將處理機(CPU)分配給執行佇列中優先權最高的程式後,該程式便一直執行下去,直至完成;或因發生某事件使該程式放棄處理機時,系統方可將處理機分配給另一個優先權高的程式。這種排程演算法主要用於批處理系統中,也可用於某些對實時性要求不嚴的實時系統中。

(2) 搶佔式優先權排程演算法(又稱可剝奪排程:Preemptive Scheduling)

該演算法的本質就是系統中當前執行的程式永遠是可執行程式中優先權最高的那個。

在這種方式下,系統同樣是把處理機分配給優先權最高的程式,使之執行。但是隻要一出現了另一個優先權更高的程式時,排程程式就暫停原最高優先權程式的執行,而將處理機分配給新出現的優先權最高的程式,即剝奪當前程式的執行。因此,在採用這種排程演算法時,每當出現一新的可執行程式,就將它和當前執行程式進行優先權比較,如果高於當前程式,將觸發程式排程。

這種方式的優先權排程演算法,能更好的滿足緊迫程式的要求,故而常用於要求比較嚴格的實時系統中,以及對效能要求較高的批處理和分時系統中。Linux也採用這種排程演算法。

3.多級反饋佇列排程

這是時下最時髦的一種排程演算法。其本質是:綜合了時間片輪轉排程和搶佔式優先權排程的優點,即:優先權高的程式先執行給定的時間片,相同優先權的程式輪流執行給定的時間片。

4.實時排程

最後我們來看一下實時系統中的排程。什麼叫實時系統,就是系統對外部事件有求必應、儘快響應。在實時系統中存在有若干個實時程式或任務,它們用來反應或控制某個(些)外部事件,往往帶有某種程度的緊迫性,因而對實時系統中的程式排程有某些特殊要求。

在實時系統中,廣泛採用搶佔排程方式,特別是對於那些要求嚴格的實時系統。因為這種排程方式既具有較大的靈活性,又能獲得很小的排程延遲;但是這種排程方式也比較複雜。

我們大致瞭解以上的排程方式以後,下面具體來看Linux中的排程程式,這裡要說明的是,Linux的排程程式並不複雜,但這並不影響Linux排程程式的高效性!

 

相關文章