00. 目錄
01. 進程調度算法概述
調度算法是指:根據系統的資源分配策略所規定的資源分配算法
02. 先來先服務調度算法
先來先服務調度算法是一種最簡單的調度算法,也稱為先進先出或嚴格排隊方案。當每個進程就緒后,它加入就緒隊列。當前正運行的進程停止執行,選擇在就緒隊列中存在時間最長的進程運行。該算法既可以用於作業調度,也可以用於進程調度。先來先去服務比較適合於常作業(進程),而不利於段作業(進程)。
FCFS調度算法是一種最簡單的調度算法,該調度算法既可以用於作業調度也可以用於進程調度。在作業調度中,算法每次從后備作業隊列中選擇最先進入該隊列的一個或幾個作業,將它們調入內存,分配必要的資源,創建進程並放入就緒隊列。
在進程調度中,FCFS調度算法每次從就緒隊列中選擇最先進入該隊列的進程,將處理機分配給它,使之投入運行,直到完成或因某種原因而阻塞時才釋放處理機。
下面通過一個實例來說明FCFS調度算法的性能。假設系統中有4個作業,它們的提交時間分別是8、8.4、8.8、9,運行時間依次是2、1、0.5、0.2,系統釆用FCFS調度算法,這組作業的平均等待時間、平均周轉時間和平均帶權周轉時間如下表所示。
作業號 | 提交時間 | 運行時間 | 開始時間 | 等待時間 | 完成時間 | 周轉時間 | 帶權周轉時間 |
---|---|---|---|---|---|---|---|
1 | 8 | 2 | 8 | 0 | 10 | 2 | 1 |
2 | 8.4 | 1 | 10 | 1.6 | 11 | 2.6 | 2.6 |
3 | 8.8 | 0.5 | 11 | 2.2 | 11.5 | 2.7 | 5.4 |
4 | 9 | 0.2 | 11.5 | 2.5 | 11.7 | 2.7 | 13.5 |
平均等待時間 t = (0+1.6+2.2+2.5)/4=1.575
平均周轉時間 T = (2+2.6+2.7+2.7)/4=2.5
平均帶權周轉時間 W = (1+2.6+5.牡13.5)/4=5.625
FCFS調度算法屬於不可剝奪算法。從表面上看,它對所有作業都是公平的,但若一個長作業先到達系統,就會使后面許多短作業等待很長時間,因此它不能作為分時系統和實時系統的主要調度策略。但它常被結合在其他調度策略中使用。例如,在使用優先級作為調度策略的系統中,往往對多個具有相同優先級的進程按FCFS原則處理。
FCFS調度算法的特點是算法簡單,但效率低;對長作業比較有利,但對短作業不利(相對SJF和高響應比);有利於CPU繁忙型作業,而不利於I/O繁忙型作業。
03. 時間片輪轉調度法
時間片輪轉調度算法主要適用於分時系統。在這種算法中,系統將所有就緒進程按到達時間的先后次序排成一個隊列,進程調度程序總是選擇就緒隊列中第一個進程執行,即先來先服務的原則,但僅能運行一個時間片,如100ms。在使用完一個時間片后,即使進程並未完成其運行,它也必須釋放出(被剝奪)處理機給下一個就緒的進程,而被剝奪的進程返回到就緒隊列的末尾重新排隊,等候再次運行。
在時間片輪轉調度算法中,時間片的大小對系統性能的影響很大。如果時間片足夠大,以至於所有進程都能在一個時間片內執行完畢,則時間片輪轉調度算法就退化為先來先服務調度算法。如果時間片很小,那么處理機將在進程間過於頻繁切換,使處理機的開銷增大,而真正用於運行用戶進程的時間將減少。因此時間片的大小應選擇適當。
時間片的長短通常由以下因素確定:系統的響應時間、就緒隊列中的進程數目和系統的處理能力。
04. 短作業(SJF)優先調度算法
短作業(進程)優先調度算法是指對短作業(進程)優先調度的算法。短作業優先(SJF)調度算法是從后備隊列中選擇一個或若干個估計運行時間最短的作業,將它們調入內存運行。而短進程優先(SPF)調度算法,則是從就緒隊列中選擇一個估計運行時間最短的進程,將處理機分配給它,使之立即執行,直到完成或發生某事件而阻塞時,才釋放處理機。
短作業優先調度算法是一個非搶占策略,他的原則是下一次選擇預計處理時間最短的進程,因此短進程將會越過長作業,跳至隊列頭。該算法即可用於作業調度,也可用於進程調度。但是他對長作業不利,不能保證緊迫性作業(進程)被及時處理,作業的長短只是被估算出來的。
缺點:
- 該算法對長作業不利,SJF調度算法中長作業的周轉時間會增加。更嚴重的是,如果有一長作業進入系統的后備隊列,由於調度程序總是優先調度那些 (即使是后進來的)短作業,將導致長作業長期不被調度(“飢餓”現象,注意區分“死鎖”。后者是系統環形等待,前者是調度策略問題)。
- 該算法完全未考慮作業的緊迫程度,因而不能保證緊迫性作業會被及時處理。
- 由於作業的長短只是根據用戶所提供的估計執行時間而定的,而用戶又可能會有意或無意地縮短其作業的估計運行時間,致使該算法不一定能真正做到短作業優先調度。
【注意】 SJF調度算法的平均等待時間、平均周轉時間最少。
05. 最短剩余時間優先
最短剩余時間是針對最短進程優先增加了搶占機制的版本。在這種情況下,進程調度總是選擇預期剩余時間最短的進程。當一個進程加入到就緒隊列時,他可能比當前運行的進程具有更短的剩余時間,因此只要新進程就緒,調度程序就能可能搶占當前正在運行的進程。像最短進程優先一樣,調度程序正在執行選擇函數是必須有關於處理時間的估計,並且存在長進程飢餓的危險。
06. 高響應比優先調度算法
根據比率:R=(w+s)/s (R為響應比,w為等待處理的時間,s為預計的服務時間)
如果該進程被立即調用,則R值等於歸一化周轉時間(周轉時間和服務時間的比率)。R最小值為1.0,只有第一個進入系統的進程才能達到該值。調度規則為:當前進程完成或被阻塞時,選擇R值最大的就緒進程,它說明了進程的年齡。當偏向短作業時,長進程由於得不到服務,等待時間不斷增加,從而增加比值,最終在競爭中贏了短進程。和最短進程優先、最短剩余時間優先一樣,使用最高響應比策略需要估計預計服務時間。
高響應比優先調度算法主要用於作業調度,該算法是對FCFS調度算法和SJF調度算法的一種綜合平衡,同時考慮每個作業的等待時間和估計的運行時間。在每次進行作業調度時,先計算后備作業隊列中每個作業的響應比,從中選出響應比最高的作業投入運行。
根據公式可知:
- 當作業的等待時間相同時,則要求服務時間越短,其響應比越高,有利於短作業。
- 當要求服務時間相同時,作業的響應比由其等待時間決定,等待時間越長,其響應比越高,因而它實現的是先來先服務。
- 對於長作業,作業的響應比可以隨等待時間的增加而提高,當其等待時間足夠長時,其響應比便可升到很高,從而也可獲得處理機。克服了飢餓狀態,兼顧了長作業。
07. 優先級調度算法
優先級調度算法又稱優先權調度算法,該算法既可以用於作業調度,也可以用於進程調度,該算法中的優先級用於描述作業運行的緊迫程度。
在作業調度中,優先級調度算法每次從后備作業隊列中選擇優先級最髙的一個或幾個作業,將它們調入內存,分配必要的資源,創建進程並放入就緒隊列。在進程調度中,優先級調度算法每次從就緒隊列中選擇優先級最高的進程,將處理機分配給它,使之投入運行。
根據新的更高優先級進程能否搶占正在執行的進程,可將該調度算法分為:
- 非剝奪式優先級調度算法。當某一個進程正在處理機上運行時,即使有某個更為重要或緊迫的進程進入就緒隊列,仍然讓正在運行的進程繼續運行,直到由於其自身的原因而主動讓出處理機時(任務完成或等待事件),才把處理機分配給更為重要或緊迫的進程。
- 剝奪式優先級調度算法。當一個進程正在處理機上運行時,若有某個更為重要或緊迫的進程進入就緒隊列,則立即暫停正在運行的進程,將處理機分配給更重要或緊迫的進程。
而根據進程創建后其優先級是否可以改變,可以將進程優先級分為以下兩種:
-
靜態優先級。優先級是在創建進程時確定的,且在進程的整個運行期間保持不變。確定靜態優先級的主要依據有進程類型、進程對資源的要求、用戶要求。
-
動態優先級。在進程運行過程中,根據進程情況的變化動態調整優先級。動態調整優先級的主要依據為進程占有CPU時間的長短、就緒進程等待CPU時間的長短。
08. 多級反饋隊列調度算法
多級反饋隊列算法,不必事先知道各種進程所需要執行的時間,他是當前被公認的一種較好的進程調度算法。
多級反饋隊列調度算法的實現思想如下:
- 應設置多個就緒隊列,並為各個隊列賦予不同的優先級,第1級隊列的優先級最高,第2級隊列次之,其余隊列的優先級逐次降低。
- 賦予各個隊列中進程執行時間片的大小也各不相同,在優先級越高的隊列中,每個進程的運行時間片就越小。例如,第2級隊列的時間片要比第1級隊列的時間片長一倍, ……第i+1級隊列的時間片要比第i級隊列的時間片長一倍。
- 當一個新進程進入內存后,首先將它放入第1級隊列的末尾,按FCFS原則排隊等待調度。當輪到該進程執行時,如它能在該時間片內完成,便可准備撤離系統;如果它在一個時間片結束時尚未完成,調度程序便將該進程轉入第2級隊列的末尾,再同樣地按FCFS 原則等待調度執行;如果它在第2級隊列中運行一個時間片后仍未完成,再以同樣的方法放入第3級隊列……如此下去,當一個長進程從第1級隊列依次降到第 n 級隊列后,在第 n 級隊列中便釆用時間片輪轉的方式運行。
- 僅當第1級隊列為空時,調度程序才調度第2級隊列中的進程運行;僅當第1 ~ (i-1)級隊列均為空時,才會調度第i級隊列中的進程運行。如果處理機正在執行第i級隊列中的某進程時,又有新進程進入優先級較高的隊列(第 1 ~ (i-1)中的任何一個隊列),則此時新進程將搶占正在運行進程的處理機,即由調度程序把正在運行的進程放回到第i級隊列的末尾,把處理機分配給新到的更高優先級的進程。
多級反饋隊列的優勢有:
-
- 終端型作業用戶:短作業優先。
- 短批處理作業用戶:周轉時間較短。
- 長批處理作業用戶:經過前面幾個隊列得到部分執行,不會長期得不到處理。
- 終端型作業用戶:短作業優先。