1. 程式人生 > 其它 >【作業系統】經典處理機排程演算法

【作業系統】經典處理機排程演算法

本篇文章學習自 強連通計算機考研

先來先服務(FCFS)排程演算法

這個演算法是作業系統中最簡單的排程演算法,顧名思義,就是誰先來誰先用處理機,就和我們食堂排隊打飯一樣。可以看的出來,這種演算法是講究公平的,不管你是什麼程序,都得按照先來後到的順序來用處理機。它適用於程序排程和作業排程。

雖然說這個演算法體現了公平性,但是萬一先到達的程序或者是作業需要的用時很長,那麼就會使得後面的作業或程序(特別是後面的作業是短作業或短程序的時候)等待很久,這樣就會大大的降低處理機排程以及處理機執行的效率。

所以說,這個演算法雖然簡單並且公平,但是總體來講,對長作業或者長程序有利,而且效率比較低,特別是當一個程序需要多次請求I/O的時候,會對後面排隊的程序造成很大的影響。


短作業優先(SJF)排程演算法

雖然它叫短作業優先演算法,但它同樣適用於程序排程。而且,從名字上來看,這個排程演算法是為短作業量身定做的,當進行作業排程的時候,該排程演算法選擇一個估計執行時間最短的作業進入記憶體,當進行程序排程的時候,該演算法從就緒佇列裡面,挑一個估計執行時間最短的程序,並將處理機分配給它。

當然,這個名字我們也可以看出,這個演算法,對長作業是很不利的,當我們的就緒佇列裡面有很多短作業的時候,我們的長作業就會很長時間都得不到排程(俗稱飢餓現象),同時不知道大家注意到沒有,短不等於重要,如果說重要的作業正是那些長作業,那麼我們這個排程演算法也就沒有那麼重要了。最後一點,就是我上面所說的,是估計執行時間,這個估計其實是使用者提供的估計時間,實際的執行時間,其實大家都不知道,所以說其實這個演算法也不能真的保證可以實現短作業優先。


優先順序排程演算法

在上一個演算法中,我提到重要性這一個詞,我們肯定是希望我們的處理機優先處理比較重要的事情,就像我們的人一樣,肯定先處理重要的事情。

所以我們就有了優先順序排程的演算法,這個演算法可以優先排程重要的程序或者作業。

如果說我們更仔細的考慮的話,我們可以將這個排程演算法更細化。

\1. 如果說考慮高優先順序能否搶佔正在執行的程序,我們可以將排程演算法分為:

非剝奪式優先順序排程演算法:它的思想就是,就算有個更高優先順序的程序出現,我也會先執行完當前的程序

剝奪式優先順序排程演算法:它的就相反,當有個更高優先順序的程序出現,就暫停當前執行的程序。

\2. 如果說根據程序建立後進程的優先順序是否可以改變,可以將優先順序分為兩種:

靜態優先順序: 優先順序在建立程序的時候就確定了,直到程序結束,這個優先順序都不會改變

動態優先順序: 在程序執行的過程中,根據程序執行的情況來調整優先順序,比如說某個程序等待了很久,就可以考慮把這個程序的優先順序調高,也可以根據程序佔有cpu時間的長短,等待cpu的長短等。

一般來說,我們設定優先順序可以根據以下原則:

(1)系統程序高於使用者程序。

(2)互動型程序高於非互動型程序,因為互動型程序需要被快速的響應,比如說我們的遊戲。

(3)I/O型程序高於計算型程序,因為I/O裝置的處理速度比cpu慢的多,所以說我們如果讓I/O裝置儘快開始工作,我們的系統的執行效率會大大提高。


真題試做

某系統正在執行三個程序P1,P2,和P3,各個程序的計算(CPU)時間和I/O時間比例如下表所示。

為了提高系統資源利用率,合理的程序優先順序設定應該為()

A. P1>P2>P3

B. P3>P2>P1

C. P2>P1=P3

D. P1>P2=P3

解析:根據程序優先順序設定的規則,I/O型程序的優先順序大於計算型程序,所以,正確的優先順序設定應為P3>P2>P1,所以選B。


高響應比優先排程演算法

這個排程演算法,只用於作業排程,它考慮了每個作業的等待時間和估計的執行時間,構成我們的相應比。響應比如下:

可以看到當等待時間都相同的時候,我們的要求服務時間越短,我們的響應比越高,這個時候,就有點像我們的短作業優先排程演算法。

當要求服務的時間都相同的時候,等待時間越長,那我們的響應比就越高,此時就像我們的先來先服務演算法一樣。

同時,可以注意到的是,如果說我們某個作業的等待時間很長(長作業),那麼這個作業的響應比就會提高,也就說,不會出現長作業飢餓的現象。

所以才有人說,高相應比優先排程演算法是先來先服務和短作業優先兩種演算法的融合。


時間片輪轉排程演算法

這個演算法是在之前介紹分時系統的時候提到過。

簡單的介紹一下這個演算法的流程:程序按照到達時間進行排隊,然後排程程式每次都選佇列的第一個程序執行,但是每次每個執行的程序僅僅只能執行一個時間片,當時間片完了後,當前程序釋放處理機,如果說當前程序沒有完成的話,那麼這個程序就會到等待佇列的末尾,繼續等待下一次時間片

可以看到的是,時間片的大小對我們的系統性能影響很大。如果時間片足夠大到恰好所有程序都可以在一個時間片內執行完,那麼這個演算法就和我們之前說的先來先服務排程演算法沒有什麼區別了。

如果說時間片很小,那麼處理機就會頻繁的在程序之間切換。這樣真正留給程序執行的時間就會變少。

但時間片的長度也不是固定的,通常我們都是按照:系統響應時間,就緒佇列中的程序數,系統的處理能力這幾個因素來確定時間片的大小。


多級反饋佇列排程演算法

這個演算法相比與之前的演算法,就比較高階了,它綜合了時間片輪轉排程演算法和優先順序排程演算法,可以達到動態調整程序優先順序和時間片大小的目的。

它的排程機制如下:

(1)設定多個就緒佇列。在系統中設定多個就緒佇列,併為每個佇列賦予不同的優先順序,從第一個開始逐個降低。

(2)不同佇列程序中所賦予的執行時間也不同,優先順序越高,時間片越小。

(3)每個佇列都採用FCFS(先來先服務)演算法。輪到該程序執行時,若在該時間片內完成,便撤離作業系統,否則排程程式將其轉入第二佇列的末尾等待排程,.......。若程序最後被調到第N佇列中時,便採用時間輪轉片方式執行。

按佇列優先順序排程。排程按照優先順序最高佇列中各程序執行,僅當第一佇列空閒時才排程第二佇列程序執行。若優先順序低佇列執行中有優先順序高佇列程序執行,應立刻將此程序放入佇列末尾,把處理機分配給新到高優先順序程序。


真題試做

程序排程演算法採用固定時間片輪轉排程演算法,當時間片過大的時候,就會使時間片輪轉法轉化為()排程演算法

A. 高響應比優先

B. 先來先服務

C. 短程序優先

D. 以上選項都不對

解析:當時間片過大的時候,因為我們的程序也是按照排隊順序來進行處理機排程的,這個時候我們會認為先來先服務排程演算法。