操做系統經常使用調度算法

 

在操做系統中存在多種調度算法,其中有的調度算法適用於做業調度,有的調度算法適用於進程調度,有的調度算法二者都適用。下面介紹幾種經常使用的調度算法。算法

先來先服務(FCFS)調度算法

FCFS調度算法是一種最簡單的調度算法,該調度算法既能夠用於做業調度也能夠用於進程調度。在做業調度中,算法每次從後備做業隊列中選擇最早進入該隊列的一個或幾個做業,將它們調入內存,分配必要的資源,建立進程並放入就緒隊列。

在進程調度中,FCFS調度算法每次從就緒隊列中選擇最早進入該隊列的進程,將處理機分配給它,使之投入運行,直到完成或因某種緣由而阻塞時才釋放處理機。

下面經過一個實例來講明FCFS調度算法的性能。假設系統中有4個做業,它們的提交時間分別是八、8.四、8.八、9,運行時間依次是二、一、0.五、0.2,系統釆用FCFS調度算法,這組做業的平均等待時間、平均週轉時間和平均帶權週轉時間見表2-3。

性能

表2-3 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繁忙型做業。操作系統

短做業優先(SJF)調度算法

短做業(進程)優先調度算法是指對短做業(進程)優先調度的算法。短做業優先(SJF)調度算法是從後備隊列中選擇一個或若干個估計運行時間最短的做業,將它們調入內存運行。而短進程優先(SPF)調度算法,則是從就緒隊列中選擇一個估計運行時間最短的進程,將處理機分配給它,使之當即執行,直到完成或發生某事件而阻塞時,才釋放處理機。

例如,考慮表2-3中給出的一組做業,若系統釆用短做業優先調度算法,其平均等待時間、平均週轉時間和平均帶權週轉時間見表2-4。

blog

表2-4 SJF調度算法的性能
做業號 提交時間 運行時間 開始時間 等待時間 完成時間 週轉時間 帶權週轉時間
1 8 2 8 0 10 2 1
2 8,4 1 10.7 2.3 11.7 3.3 3.3
3 8.8 0.5 10.2 1.4 10.7 1.9 3.8
4 9 0.2 10 1 10.2 1.2 6

平均等待時間 t = (0+2.3+1.4+1)/4=1.175
平均週轉時間 T = (2+3.3+1.9+1.2)/4=2.1
平均帶權週轉時間 W = (1+3.3+3.8+6)/4=3.525

SJF調度算法也存在不容忽視的缺點:隊列

  • 該算法對長做業不利,由表2-3和表2-4可知,SJF調度算法中長做業的週轉時間會增長。更嚴重的是,若是有一長做業進入系統的後備隊列,因爲調度程序老是優先調度那些 (即便是後進來的)短做業,將致使長做業長期不被調度(「飢餓」現象,注意區分「死鎖」。後者是系統環形等待,前者是調度策略問題)。
  • 該算法徹底未考慮做業的緊迫程度,於是不能保證緊迫性做業會被及時處理。
  • 因爲做業的長短只是根據用戶所提供的估計執行時間而定的,而用戶又可能會有意或無心地縮短其做業的估計運行時間,導致該算法不必定能真正作到短做業優先調度。


注意,SJF調度算法的平均等待時間、平均週轉時間最少。進程

優先級調度算法

優先級調度算法又稱優先權調度算法,該算法既能夠用於做業調度,也能夠用於進程調度,該算法中的優先級用於描述做業運行的緊迫程度。

在做業調度中,優先級調度算法每次從後備做業隊列中選擇優先級最髙的一個或幾個做業,將它們調入內存,分配必要的資源,建立進程並放入就緒隊列。在進程調度中,優先級調度算法每次從就緒隊列中選擇優先級最高的進程,將處理機分配給它,使之投入運行。

根據新的更高優先級進程可否搶佔正在執行的進程,可將該調度算法分爲:事件

  • 非剝奪式優先級調度算法。當某一個進程正在處理機上運行時,即便有某個更爲重要或緊迫的進程進入就緒隊列,仍然讓正在運行的進程繼續運行,直到因爲其自身的緣由而主動讓出處理機時(任務完成或等待事件),才把處理機分配給更爲重要或緊迫的進程。
  • 剝奪式優先級調度算法。當一個進程正在處理機上運行時,如有某個更爲重要或緊迫的進程進入就緒隊列,則當即暫停正在運行的進程,將處理機分配給更重要或緊迫的進程。


而根據進程建立後其優先級是否能夠改變,能夠將進程優先級分爲如下兩種:內存

  • 靜態優先級。優先級是在建立進程時肯定的,且在進程的整個運行期間保持不變。肯定靜態優先級的主要依據有進程類型、進程對資源的要求、用戶要求。
  • 動態優先級。在進程運行過程當中,根據進程狀況的變化動態調整優先級。動態調整優先級的主要依據爲進程佔有CPU時間的長短、就緒進程等待CPU時間的長短。

高響應比優先調度算法

高響應比優先調度算法主要用於做業調度,該算法是對FCFS調度算法和SJF調度算法的一種綜合平衡,同時考慮每一個做業的等待時間和估計的運行時間。在每次進行做業調度時,先計算後備做業隊列中每一個做業的響應比,從中選出響應比最高的做業投入運行。

響應比的變化規律可描述爲:


根據公式可知:資源

  • 看成業的等待時間相同時,則要求服務時間越短,其響應比越高,有利於短做業。
  • 當要求服務時間相同時,做業的響應比由其等待時間決定,等待時間越長,其響應比越高,於是它實現的是先來先服務。
  • 對於長做業,做業的響應比能夠隨等待時間的增長而提升,當其等待時間足夠長時,其響應比即可升到很高,從而也可得到處理機。克服了飢餓狀態,兼顧了長做業。

時間片輪轉調度算法

時間片輪轉調度算法主要適用於分時系統。在這種算法中,系統將全部就緒進程按到達時間的前後次序排成一個隊列,進程調度程序老是選擇就緒隊列中第一個進程執行,即先來先服務的原則,但僅能運行一個時間片,如100ms。在使用完一個時間片後,即便進程並未完成其運行,它也必須釋放出(被剝奪)處理機給下一個就緒的進程,而被剝奪的進程返回到就緒隊列的末尾從新排隊,等候再次運行。

在時間片輪轉調度算法中,時間片的大小對系統性能的影響很大。若是時間片足夠大,以致於全部進程都能在一個時間片內執行完畢,則時間片輪轉調度算法就退化爲先來先服務調度算法。若是時間片很小,那麼處理機將在進程間過於頻繁切換,使處理機的開銷增大,而真正用於運行用戶進程的時間將減小。所以時間片的大小應選擇適當。

時間片的長短一般由如下因素肯定:系統的響應時間、就緒隊列中的進程數目和系統的處理能力。io

多級反饋隊列調度算法(集合了前幾種算法的優勢)

多級反饋隊列調度算法是時間片輪轉調度算法和優先級調度算法的綜合和發展,如圖2-5 所示。經過動態調整進程優先級和時間片大小,多級反饋隊列調度算法能夠兼顧多方面的系統目標。例如,爲提升系統吞吐量和縮短平均週轉時間而照顧短進程;爲得到較好的I/O設備利用率和縮短響應時間而照顧I/O型進程;同時,也沒必要事先估計進程的執行時間。


圖2-5  多級反饋隊列調度算法


多級反饋隊列調度算法的實現思想以下:

  1. 應設置多個就緒隊列,併爲各個隊列賦予不一樣的優先級,第1級隊列的優先級最高,第2級隊列次之,其他隊列的優先級逐次下降。
  2. 賦予各個隊列中進程執行時間片的大小也各不相同,在優先級越高的隊列中,每一個進程的運行時間片就越小。例如,第2級隊列的時間片要比第1級隊列的時間片長一倍, ……第i+1級隊列的時間片要比第i級隊列的時間片長一倍。
  3. 當一個新進程進入內存後,首先將它放入第1級隊列的末尾,按FCFS原則排隊等待調度。當輪到該進程執行時,如它能在該時間片內完成,即可準備撤離系統;若是它在一個時間片結束時還沒有完成,調度程序便將該進程轉入第2級隊列的末尾,再一樣地按FCFS 原則等待調度執行;若是它在第2級隊列中運行一個時間片後仍未完成,再以一樣的方法放入第3級隊列……如此下去,當一個長進程從第1級隊列依次降到第 n 級隊列後,在第 n 級隊列中便釆用時間片輪轉的方式運行。
  4. 僅當第1級隊列爲空時,調度程序才調度第2級隊列中的進程運行;僅當第1 ~ (i-1)級隊列均爲空時,纔會調度第i級隊列中的進程運行。若是處理機正在執行第i級隊列中的某進程時,又有新進程進入優先級較高的隊列(第 1 ~ (i-1)中的任何一個隊列),則此時新進程將搶佔正在運行進程的處理機,即由調度程序把正在運行的進程放回到第i級隊列的末尾,把處理機分配給新到的更高優先級的進程。


多級反饋隊列的優點有:

    • 終端型做業用戶:短做業優先。
    • 短批處理做業用戶:週轉時間較短。
    • 長批處理做業用戶:通過前面幾個隊列獲得部分執行,不會長期得不處處理。
相關文章
相關標籤/搜索