CPU的調度和schedule()(哈工大李志軍)

CPU調度策略

CPU調度即在就緒隊列中,通過調度選擇下一個執行的任務。
在這裏插入圖片描述

調度算法:

  • 儘快結束任務:週轉時間(從任務進入到任務結束)短
  • 用戶操作儘快響應:響應時間(從操作發生到響應)短
  • 系統內耗時間少:吞吐量(完成的任務量)

如何做到合理?

  • 吞吐量與響應時間的矛盾:
    在這裏插入圖片描述

  • 前臺任務和後臺任務的關注點不同

    前臺任務關注響應時間,後臺任務關注週轉時間。

  • IO約束型任務和CPU約束型任務:
    在這裏插入圖片描述

  • IO約束型任務: CPU區間長度較短,調用IO頻率較大。多是前臺任務。

  • CPU約束型任務: CPU區間長度較長,調用CPU頻率高。多是後臺任務。

週轉時間=作業完成時刻—作業到達時刻;
帶權週轉時間=週轉時間/服務時間;
平均週轉時間=作業週轉總時間/作業個數;
平均帶權週轉時間=帶權週轉總時間/作業個數;


First Come, First Served(FCFS),先來先服務

在這裏插入圖片描述

縮短週轉時間:短作業優先(SJF)

在這裏插入圖片描述
短作業優先的調度平均週轉時間最短。
證明:
平均週轉時間:
p1+(p1+p2)+(p1+p2+p3)+....+(p1+p2+...+pn)p_1+(p_1+p_2)+(p_1+p_2+p_3)+....+(p_1+p_2+...+p_n)
合併之後:
=np1+(n1)p2+....+pi=(n+1+i)pi = np_1+(n-1)p_2+....+p_i = \sum(n+1+i)p_i
任取兩個任務 pj<pk,(j<k)p_j < p_k,(j<k)
平均週轉時間:
=np1+(n1)p2+....+(n+1j)pj+.....+(n+1k)pk+...+pi = np_1+(n-1)p_2+....+(n+1-j)p_j+.....+(n+1-k)p_k+...+p_i
交換 pj,pkp_j,p_k
=np1+(n1)p2+....+(n+1j)pk+.....+(n+1k)pj+...+pi = np_1+(n-1)p_2+....+(n+1-j)p_k+.....+(n+1-k)p_j+...+p_i
pj<pkp_j < p_k
(n+1j)pj+(n+1k)pk<(n+1j)pk+(n+1k)pj(n+1-j)p_j+(n+1-k)p_k < (n+1-j)p_k+(n+1-k)p_j
所以短作業優先可以保證平均週轉時間最短。

縮短響應時間:時間片輪轉

在這裏插入圖片描述
設定時間片的大小,將時間片分配到每個任務,依次執行直至全部執行完畢。

調度算法的選擇:

在這裏插入圖片描述

在這裏插入圖片描述
後臺任務得不到運行->嘗試後臺任務優先級動態升高 -> 前臺響應時間拉長 -> 嘗試前後臺任務使用時間片 -> 退化到僅時間片輪轉 -> 時間片輪轉的弊端 …
在這裏插入圖片描述

一個實際的 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調度。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章