1. 程式人生 > >作業系統中常用的程序排程演算法

作業系統中常用的程序排程演算法

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

先來先服務(FCFS)排程演算法是一種最簡單的排程演算法,該演算法既可用於作業排程,也可用於程序排程。當在作業排程中採用該演算法時,每次排程都是從後備作業佇列中選擇一個或多個最先進入該佇列的作業,將它們調入記憶體,為它們分配資源、建立程序,然後放入就緒佇列。在程序排程中採用FCFS演算法時,則每次排程是從就緒佇列中選擇一個最先進入該佇列的程序,為之分配處理機,使之投入執行。該程序一直執行到完成或發生某事件而阻塞後才放棄處理機。

2、短作業(程序)優先排程演算法

短作業(程序)優先排程演算法,是指對短作業或短程序優先排程的演算法。它們可以分別用於作業排程和程序排程。短作業優先

(SJF)的排程演算法是從後備佇列中選擇一個或若干個估計執行時間最短的作業,將它們調入記憶體執行。而短程序優先(SPF)排程演算法則是從就緒佇列中選出一個估計執行時間最短的程序,將處理機分配給它,使它立即執行並一直執行到完成,或發生某事件而被阻塞放棄處理機時再重新排程。

3、時間片輪轉法

在早期的時間片輪轉法中,系統將所有的就緒程序按先來先服務的原則排成一個佇列,每次排程時,CPU分配給隊首程序,並令其執行一個時間片。時間片的大小從幾ms到幾百ms。當執行的時間片用完時,由一個計時器發出時鐘中斷請求,排程程式便據此訊號來停止該程序的執行,並將它送往就緒佇列的末尾;然後,再把處理機分配給就緒佇列中新的隊首程序

,同時也讓它執行一個時間片。這樣就可以保證就緒佇列中的所有程序在一給定的時間內均能獲得一時間片的處理機執行時間。換言之,系統能在給定的時間內響應所有使用者的請求

4、多級反饋佇列排程演算法

前面介紹的各種用作程序排程的演算法都有一定的侷限性。如短程序優先的排程演算法,僅照顧了短程序而忽略了長程序,而且如果並未指明程序的長度,則短程序優先和基於程序長度的搶佔式排程演算法都將無法使用。而多級反饋佇列排程演算法則不必事先知道各種程序所需的執行時間,而且還可以滿足各種型別程序的需要,因而它是目前被公認的一種較好的程序排程演算法。在採用多級反饋佇列排程演算法的系統中,排程演算法的實施過程如下所述:

1)應設定多個就緒佇列,併為各個佇列賦予不同的優先順序。第一個佇列的優先順序最高,第二個佇列次之,其餘各佇列的優先權逐個降低。該演算法賦予各個佇列中程序執行時間片的大小也各不相同,在優先權愈高的佇列中,為每個程序所規定的執行時間片就愈小。例如,第二個佇列的時間片要比第一個佇列的時間片長一倍,第i+1個佇列的時間片要比第i個佇列的時間片長一倍。

2)當一個新程序進入記憶體後,首先將它放入第一佇列的末尾,按FCFS原則排隊等待排程。當輪到該程序執行時,如它能在該時間片內完成,便可準備撤離系統;如果它在一個時間片結束時尚未完成,排程程式便將該程序轉入第二佇列的末尾,再同樣地按FCFS原則等待排程執行;如果它在第二佇列中執行一個時間片後仍未完成,再依次將它放入第三佇列,……,如此下去,當一個長作業(程序)從第一佇列依次降到第n佇列後,在第n佇列便採取按時間片輪轉的方式執行。

3)僅當第一佇列空閒時,排程程式才排程第二佇列中的程序執行;僅當第1(i-1)佇列均空時,才會排程第i佇列中的程序執行。如果處理機正在第i佇列中為某程序服務時,又有新程序進入優先權較高的佇列(1(i-1)中的任何一個佇列),則此時新程序將搶佔正在執行程序的處理機,即第i佇列中某個正在執行的程序的時間片用完後,由排程程式選擇優先權較高的佇列中的那一個程序,把處理機分配給它。

5、優先權排程演算法

為了照顧緊迫型作業,使之在進入系統後便獲得優先處理,引入了最高優先權優先(FPF)排程演算法。此演算法常被用於批處理系統中,作為作業排程演算法,也作為多種作業系統中的程序排程演算法,還可用於實時系統中。當把該演算法用於作業排程時,系統將從後備佇列中選擇若干個優先權最高的作業裝入記憶體。當用於程序排程時,該演算法是把處理機分配給就緒佇列中優先權最高的程序,這時,又可進一步把該演算法分成如下兩種。

1) 非搶佔式優先權演算法

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

2) 搶佔式優先權排程演算法

在這種方式下,系統同樣是把處理機分配給優先權最高的程序,使之執行。但在其執行期間,只要又出現了另一個其優先權更高的程序,程序排程程式就立即停止當前程序(原優先權最高的程序)的執行,重新將處理機分配給新到的優先權最高的程序。因此,在採用這種排程演算法時,是每當系統中出現一個新的就緒程序i時,就將其優先權Pi與正在執行的程序j的優先權Pj進行比較。如果PiPj,原程序Pj便繼續執行;但如果是Pi>Pj,則立即停止Pj的執行,做程序切換,使i程序投入執行。顯然,這種搶佔式的優先權排程演算法能更好地滿足緊迫作業的要求,故而常用於要求比較嚴格的實時系統中,以及對效能要求較高的批處理和分時系統中。

6、Unix、Linux與Windows程序排程策略的比較

無論是在批處理系統還是分時系統中,使用者程序數一般都多於處理機數、這將導致它們互相爭奪處理機。另外,系統程序也同樣需要使用處理機。這就要求程序排程程式按一定的策略,動態地把處理機分配給處於就緒佇列中的某一個程序,以使之執行。 

程序排程的實質是資源的分配,如何使系統能夠保持較短的響應時間和較高的吞吐量,如何在多個可執行的程序中選取一個最值得執行的程序投入執行是排程器的主要任務。程序排程包括兩個方面的內容:何時分配CPU 時間(排程時機)即排程器什麼時候啟動;如何選擇程序(排程演算法)即排程器該怎麼做。程序排程主要可以分為非剝奪方式與剝奪方式兩種。

非剝奪方式:排程程式一旦把處理機分配給某程序後便讓它一直執行下去,直到程序完成或發生某事件而阻塞時,才把處理機分配給另一個程序。 

剝奪方式:當一個程序正在執行時,系統可以基於某種原則,剝奪已分配給它的處理機,將之分配給其它程序。剝奪原則有:優先權原則、短程序優先原則、時間片原則

Linux 從整體上區分實時程序和普通程序,因為實時程序和普通程序度排程是不同的,它們兩者之間,實時程序應該先於普通程序而執行,然後,對於同一型別的不同程序,採用不同的標準來選擇程序。對普通程序的排程策略是動態優先排程,對於實時程序採用了兩種排程策略,FIFO(先來先服務排程)RR(時間片輪轉排程)

UNIX系統是單純的分時系統,所以沒有設定作業排程。UNIX系統的程序排程採用的演算法是,多級反饋佇列排程法。其核心思想是先從最高休先級就緒佇列中取出排在佇列最前面的程序,當程序執行完一個時間片仍未完成則剝奪它的執行,將它放入到相應的佇列中,取出下一個就緒程序投入執行,對於同一個佇列中的各個程序,按照時間片輪轉法排程。多級反饋佇列排程演算法即能使高優先順序的作業得到響應又能使短作業(程序)迅速完成。但是它還是存在某些方面的不足,當不斷有新程序到來時,則長程序可能飢餓

Windows 系統其排程方式比較複雜,它的處理器排程的排程單位是執行緒而不是程序,是基於優先順序的搶佔式多處理器排程,依據優先順序和分配時間片來排程。而且Windows 2000/XP在單處理器系統和多處理器系統中的執行緒排程是不同的執行緒排程機制,Windows作業系統的排程系統總是執行優先順序最高的就緒執行緒。在同一優先順序的各執行緒按時間片輪轉演算法進行排程。如果一個高優先順序的執行緒進入就緒狀態,當前執行的執行緒可能在用完它的時間片之前就被搶佔處理機。

多工、有執行緒優先順序、多種中斷級別這是現代作業系統的共同特點。實時作業系統(Real-time operating system, RTOS)最大的特點是對響應時間有嚴格的要求linux尚且不能稱為完全的實時作業系統,USA的宇宙飛船常用的作業系統是VxWorks,這才是聞名於世的RTOS