CPU調度的概念:
見之前寫的“CPU管理的直觀想法和多進程圖像”
CPU調度的動機
面對諸多的場景,如何設計調度算法呢?首先,我們要明白我們的算法應該讓什么更好呢?
面對客戶:銀行調度算法的設計目標應該是用戶滿意; 而面對進程:CPU調度的目標應該是進程滿意。
那怎么才能讓進程滿意呢?那就是時間了。進程希望盡早地結束任務,這就是周轉時間(從任務到達到任務結束)要短,而且希望用戶的操作能夠盡快地被響應,這就是響應時間(從操作發生到響應)要短。而且系統內耗時間要少,吞吐量(任務的完成量)要大,系統需要把更多的時間用在任務的執行上,而不能老是去做無關緊要的事情,例如:頻繁切換任務,切換棧,分配資源等事情。
同時,系統還要去合理地調配任務。那么,CPU的調度策略如何做到合理呢?首先得明白系統中有以下的幾種矛盾。
1.吞吐量和響應時間之間有矛盾響應時間小=>切換次數多=>系統內耗大=>吞吐量小由於需要較短的響應時間,那么就得頻繁地切換任務,這樣系統的很多時間都花在切換任務上面了,系統的內耗大了,吞吐量就小了。
2.前台任務和后台任務的關注點不同前台任務關注響應時間,后台任務關注周轉時間。前台任務例如我們的word文檔,我們打一個字,需要立馬顯示在文檔中,這就是word文檔這個任務關注的是響應時間;而后台任務中,例如我們的javac編譯java代碼,它的周轉時間要小,即該任務從進入到結束所花的時間要小,即編譯完成的時間要小。
3.IO約束型任務和CPU約束型任務各有各的特點IO約束型任務就是使用CPU的時間較少,進行IO操作的時間較長,CPU約束型的任務就是使用CPU的時間較長。因此,要做到合理,需要折中、綜合考慮以上的幾種矛盾。
基本的CPU調度策略:
1、先到先服務(FCFS):
采用這種方案,先請求的進程先得到CPU,由於是非搶先調度,所以一個進程得到CPU后,會一直占用CPU到該進程結束。
- 優點:簡單,理解容易
- 缺點:進程平均等待時間長,假設一組進程(P1, P2, P3),所需時間(24, 3, 3), CPU執行長度按ms記,按照FCFS算法,執行順序為(P1, P2, P3)則平均等待時間為 (0 + 24 + 27) / 3 = 17ms,如果執行順序為(P2, P3, P1), 則平均等待時間為(0 + 3 + 6) / 3 = 3ms,這個減少是相當大的
這個算法將每個進程與下次CPU執行的長度關聯起來,當CPU變為空閑時,它會被賦給CPU執行時間最短的進程。
參考:
對於任意一組給定的進程,SJF算法的平均等待時間最小,因為總是可以通過把短進程移到長進程之前,來使平均等待時間減少。
- 優點:如果能夠實現將是最優的。
- 缺點:這個算法有一個附加的問題,就是如何准確地知道每個進程所需要的時間,這是很困難的,所以SJF算法經常用於長期調度,將用戶提交作業時指定的進程時限作為長度。
3、優先級調度(priority-scheduling):
每個進程都有一個優先級,進程的執行順序按照優先級,SJF算法也屬於優先級調度,其優先級為CPU執行時間的倒數,優先級調度可以是搶占的或非搶占的。
該算法的一個問題是可能導致無限阻塞或飢餓,一個解決的辦法稱為老化,每隔一段時間就將所有處於等待狀態的進程的優先級提高一級,這樣可以證明,在不超過一個常數的時間內,所有進程都會執行。
該算法的一個問題是可能導致無限阻塞或飢餓,一個解決的辦法稱為老化,每隔一段時間就將所有處於等待狀態的進程的優先級提高一級,這樣可以證明,在不超過一個常數的時間內,所有進程都會執行。
4、
輪轉(RR):該算法是專門為分時系統設計的,類將一個較小的時間單元定義為
時間片,通常為10ms~100ms,就緒隊列為一個
循環隊列,為每一個進程分配不超過一個時間片的CPU,如進程(P1, P2, P3)對應的CPU為(24, 3, 3),如果使用4ms的時間片,那每個時間片中執行的進程為(P1, P2, P3, P1, P1, P1, P1, P1),等待時間6ms, 4ms, 7ms, 平均等待時間為 (6 + 4 + 7) / 3 = 5.6667ms。
說到這里,SJF是關注系統的平均周轉時間,而RR算法是關注系統的響應時間,但是如果一個系統需要響應時間小和周轉時間小同時存在,那該怎么辦?
比如word很關心響應時間,而javac編譯java程序更關心周轉時間,兩類任務同時存在該怎么辦?
即前台的任務更關心響應時間,因為前台任務是與用戶直接進行交互的,需要快速響應用戶的請求,后台任務更關心周轉時間,需要快速的結束任務的。
一個很直觀的想法,定義前台任務和后台任務兩條隊列,前台使用RR算法,后台使用SJF算法,只有前台任務沒有時才調度后台任務。
但是這樣又會產生問題,如果一直有前台任務怎么辦,那這樣后台任務就永遠得不到調度了。
在這里有一個有趣的小故事:1973年有位工作人員去關閉MIT的IBM7094計算機時,發現有一個進程在1967年提交但一直未運行。
這時候我們可以讓后台的任務優先級動態升高,但后台任務(用SJF調度)一旦執行,那前台任務的響應時間又得變大了。
如果我們前后台任務都用時間片,那又退化為了RR算法。
所以,問題還有很多等着我們去發現去想辦法解決。
如我們怎么知道哪些是前台任務那些是后台任務呢,前台任務難道就沒有后台任務的工作?后台任務難道沒有前台任務的工作?SJF中的短作業優先如何體現?如何判斷作業的長度?
參考:
1、https://zhuanlan.zhihu.com/p/111813230
2、https://zhuanlan.zhihu.com/p/142812907
3、https://zhuanlan.zhihu.com/p/96837740
