調度算法
一、時間片輪轉(RR, Round-Robin)
例題:各進程到達就緒隊列的時間、需要的運行時間如下表所示。使用時間片輪轉(常用於分時操作系統,更注重“響應時間”,因而此處不計算周轉時間)調度算法,分析時間片大小分別是2、5時的進程運行情況。
時間片輪轉調度算法:輪流讓就緒隊列中的進程依次執行一個時間片(每次選擇的都是排在就緒隊列隊頭的進程)
時間片大小為2(注:以下括號內表示當前時刻就緒隊列中的進程、進程的剩余運行時間)
0時刻(P1(5)) :0時刻只有P1到達就緒隊列,讓P1上處理機運行一個時間片
2時刻(P2(4)→P1(3)) :2時刻P2到達就緒隊列,P1運行完一個時間片,被剝奪處理機,重新放到隊尾。此時P2排在隊頭,因此讓P2上處理機。(注意:2時刻,P1下處理機,同一時刻新進程P2到達,如果在題目中遇到這種情況,默認新到達的進程先進入就緒隊列)
4時刻(P1(3)→P3(1)→P2(2)) :4時刻,P3到達,先插到就緒隊尾,緊接着,P2下處理機也插到隊尾
5時刻(P3(1)→P2(2)→P4(6)):5時刻,P4到達插到就緒隊尾(注意:由於P1的時間片還沒用完,因此暫時不調度。另外,此時P1處於運行態,並不在就緒隊列中)
6時刻(P3(1)→ P2(2)→P4(6)→P1(1))∶ 6時刻,P1時間片用完,下處理機,重新放回就緒隊尾,發生調度
7時刻(P2(2)→P4(6)→P1(1)):雖然P3的時間片沒用完,但是由於P3只需運行1個單位的時間,運行完了會主動放棄處理機,因此也會發生調度。隊頭進程P2上處理機。
9時刻(P4(6)→ P1(1)):進程P2時間片用完,並剛好運行完,發生調度,P4上處理機
11時刻(P1(1)→P4(4)) :P4時間片用完,重新回到就緒隊列。P1上處理機
12時刻((P4(4)) :P1運行完,主動放棄處理機,此時就緒隊列中只剩P4,P4上處理機
14時刻():就緒隊列為空,因此讓P4接着運行一個時間片。
16時刻:所有進程運行結束
時間片大小為5
0時刻(P1(5)) :只有P1到達,P1上處理機。
2時刻(P2(4)) :P2到達,但P1時間片尚未結束,因此暫不調度
4時刻(P2(4) >P3(1)):P3到達,但P1時間片尚未結束,因此暫不調度
5時刻( P2(4)→ P3(1)→ P4(6)) :P4到達,同時,P1運行結束。發生調度,P2上處理機。
9時刻( P3(1)→P4(6) ):P2運行結束,雖然時間片沒用完,但是會主動放棄處理機。發生調度。
10時刻( P4(6)):P3運行結束,雖然時間片沒用完,但是會主動放棄處理機。發生調度。
15時刻()∶P4時間片用完,但就緒隊列為空,因此會讓P4繼續執行一個時間片。
16時刻() :P4運行完,主動放棄處理機。所有進程運行完。
如果時間片太大,使得每個進程都可以在一個時間片內就完成,則時間片輪轉調度算法退化為先來先服務調度算法,並且會增大進程響應時間。因此時間片不能太大。
比如:系統中有10個進程在並發執行,如果時間片為1秒,則一個進程被響應可能需要等9秒...也就是說,如果用戶在自己進程的時間片外通過鍵盤發出調試命令,可能需要等待9秒才能被系統響應
另一方面,進程調度、切換是有時間代價的(保存、恢復運行環境),因此如果時間片太小,會導致進程切換過於頻繁,系統會花大量的時間來處理進程切換,從而導致實際用於進程執行的時間比例減少。可見時間片也不能太小。
一般來說,設計時間片時要讓切換進程的開銷占比不超過1%
二、優先級調度算法
例題:各進程到達就緒隊列的時間、需要的運行時間、進程優先數如下表所示。使用非搶占式的優先級調度算法,分析進程運行情況。(注:優先數越大,優先級越高)
非搶占式的優先級調度算法:每次調度時選擇當前已到達且優先級最高的進程。當前進程主動放棄處理機時發生調度。
注:以下括號內表示當前處於就緒隊列的進程
0時刻(P1):只有P1到達,P1上處理機。
7時刻(P2、P3、P4):P1運行完成主動放棄處理機,其余進程都已到達,P3優先級最高,P3上處理機。
8時刻( P2、P4 ) :P3完成,P2、P4優先級相同,由於P2先到達,因此P2優先上處理機
12時刻(P4) :P2完成,就緒隊列只剩P4,P4上處理機。
16時刻( ) :P4完成,所有進程都結束
搶占式的優先級調度算法:每次調度時選擇當前已到達且優先級最高的進程。當前進程主動放棄處理機時發生調度。另外,當就緒隊列發生改變時也需要檢查是會發生搶占。
注:以下括號內表示當前處於就緒隊列的進程
0時刻(P1):只有P1到達,P1上處理機。
2時刻(P2):P2到達就緒隊列,優先級比P1更高,發生搶占。P1回到就緒隊列,P2上處理機。
4時刻(P1、P3):P3到達,優先級比P2更高,P2回到就緒隊列,P3搶占處理機。
5時刻(P1、P2、P4):P3完成,主動釋放處理機,同時,P4也到達,由於P2比P4更先進入就緒隊列,因此選擇P2上處理機
7時刻(P1、P4): P2完成,就緒隊列只剩P1、P4,P4上處理機。
補充:
就緒隊列未必只有一個,可以按照不同優先級來組織。另外,也可以把優先級高的進程排在更靠近隊頭的位置
根據優先級是否可以動態改變,可將優先級分為靜態優先級和動態優先級兩種。靜態優先級:創建進程時確定,之后一直不變。
動態優先級:創建進程時有一個初始值,之后會根據情況動態地調整優先級。
如何合理地設置各類進程的優先級?
通常:
系統進程優先級高於用戶進程
前台進程優先級高於后台進程、
操作系統更偏好l/O型進程(或稱l/O繁忙型進程)
注:與I/O型進程相對的是計算型進程(或稱CPU繁忙型進程)
I/O設備和CPU可以並行工作。如果優先讓I/O繁忙型進程優先運行的話,則越有可能讓I/O設備盡早地投入工作,則資源利用率、系統吞吐量都會得到提升
如果采用的是動態優先級,什么時候應該調整?
可以從追求公平、提升資源利用率等角度考慮
如果某進程在就緒隊列中等待了很長時間,則可以適當提升其優先級
如果某進程占用處理機運行了很長時間,則可適當降低其優先級
如果發現一個進程頻繁地進行l/O操作,則可適當提升其優先級
三、多級反饋隊列調度算法
例題:各進程到達就緒隊列的時間、需要的運行時間如下表所示。使用多級反饋隊列調度算法,分析進程運行的過程。
設置多級就緒隊列,各級隊列優先級從高到低,時間片從小到大
新進程到達時先進入第1級隊列,按FCFS原則排隊等待被分配時間片。若用完時間片進程還未結束,則進程進入下一級隊列隊尾。如果此時已經在最下級的隊列,則重新放回最下級隊列隊尾
只有第k級隊列為空時,才會為k+1級隊頭的進程分配時間片
被搶占處理機的進程重新放回原隊列隊尾
P1(1)—>P2(1)—>P1(2)
一>P2(1)—>P3(1)—>P2(2)
—>P1(4)—>P1(1)
注:比起早期的批處理操作系統來說,由於計算機造價大幅降低,因此之后出現的交互式操作系統(包括分時操作系統、實時操作系統等)更注重系統的響應時間、公平性、平衡性等指標。而這幾種算法恰好也能較好地滿足交互式系統的需求。因此這三種算法適合用於交互式系統。(比如UNIX使用的就是多級反饋隊列調度算法)