目錄
CPU調度策略
CPU調度即在就緒隊列中,通過調度選擇下一個執行的任務。
調度算法:
- 儘快結束任務:週轉時間(從任務進入到任務結束)短
- 用戶操作儘快響應:響應時間(從操作發生到響應)短
- 系統內耗時間少:吞吐量(完成的任務量)
如何做到合理?
-
吞吐量與響應時間的矛盾:
-
前臺任務和後臺任務的關注點不同:
前臺任務關注響應時間,後臺任務關注週轉時間。
-
IO約束型任務和CPU約束型任務:
-
IO約束型任務: CPU區間長度較短,調用IO頻率較大。多是前臺任務。
-
CPU約束型任務: CPU區間長度較長,調用CPU頻率高。多是後臺任務。
週轉時間=作業完成時刻—作業到達時刻;
帶權週轉時間=週轉時間/服務時間;
平均週轉時間=作業週轉總時間/作業個數;
平均帶權週轉時間=帶權週轉總時間/作業個數;
First Come, First Served(FCFS),先來先服務
縮短週轉時間:短作業優先(SJF)
短作業優先的調度平均週轉時間最短。
證明:
平均週轉時間:
合併之後:
任取兩個任務
平均週轉時間:
交換 :
由
所以短作業優先可以保證平均週轉時間最短。
縮短響應時間:時間片輪轉
設定時間片的大小,將時間片分配到每個任務,依次執行直至全部執行完畢。
調度算法的選擇:
後臺任務得不到運行->
嘗試後臺任務優先級動態升高 ->
前臺響應時間拉長 ->
嘗試前後臺任務使用時間片 ->
退化到僅時間片輪轉 ->
時間片輪轉的弊端 …
一個實際的 schedule() 函數
while
循環找出PCB數組(task[]
)中counter
最大的就緒態的進程,設爲next
。if(counter != 0)
直接切換到next
進程else if(counter == 0)
進入for循環,將 PCB數組中所有進程counter = counter / 2 + priority
:- 此時如果就緒態的進程,執行前
counter
應爲0
- 如果是阻塞態的進程(如 IO), 執行後
counter
應比就緒態的counter
大,使其執行時間更長,優先級更高,此處實現了優先級的動態調整。
- 此時如果就緒態的進程,執行前
counter
第一個作用:時間片
counter
第二個作用:優先級
counter
總結
因爲時間片輪轉短作業的任務也會先執行完,所以輪轉起來也近似了SJF調度。