進程調度

現在操作系統大多都是應用多時多任務系統。這一般就涉及進程調度。下面介紹幾種常見的調度算法。

先進先出算法(FIFO)

算法總是把CPU分配給最先請求的進程。這種策略可以輕易用FIFO的隊列來實現。

採用FCFS平均等待時間很長。


最短作業優先算法(SJF)

最短CPU運行期優先調度算法
該算法從就緒隊列中選出下一個“CPU執行期最短”的進程,爲之分配CPU。

該算法雖可獲得較好的調度性能,但難以準確地知道下一個CPU執行期,而只能根據每一個進程的執行歷史來預測。

SJF遇到的問題是長任務的程序可能飢餓。


優先級算法:

   這是一種根據進程的價值和其對CPU時間的需求來對進程分級的想法。優先級高的進程先運行,低的後運行,相同優先級的進程按FIFO方式進行調度。優先級算法也分爲可搶佔和不可搶佔的。可搶佔式的響應度高,當獲得一個新的請求時,先比較新進程與當前進程的優先級,優先級高的可以搶佔當前進程。當然這種方式更易導致低優先級進程餓死,可以採用老化的方式來解決這個問題。

這種算法會導致無窮阻塞或飢餓。



輪轉法(RR)

前幾種算法主要用於批處理系統中,不能作爲分時系統中的主調度算法,在分時系統中,都採用時間片輪轉法。

簡單輪轉法:系統將所有就緒進程按FIFO規則排隊,按一定的時間間隔把CPU分配給隊列中的進程。這樣,就緒隊列中所有進程均可獲得一個時間片的CPU而運行。

該方法的缺點就是調度頻繁,上下文切換耗時較多。RR的性能受限於時間片的大小。這個算法的關鍵點在於時間片的選擇,時間片過大,那麼輪轉就越接近FIFO,如果太小,進程切換的開銷大於執行程序的開銷,從而降低了系統效率。因此選擇合適的時間片就非常重要。選擇時間片的兩個需要考慮的因素:一次進程切換所使用的系統消耗以及我們能接受的整個系統消耗、系統運行的進程數。


最高響應比優先算法(HRN)
按響應比由大到小的次序調度。
響應比計算公式如下:
rr=(bt+wt)/bt  
BT爲CPU陣發時間,WT爲等待時間。顯然,對於同時到達的任務,處理時間短的將被優先調度,處理時間較長的作業將隨其等待時間的增加而動態提升其響應比,因而不會出現餓死現象。


linux下的進程調度:

linux實現公平調度基本上是兩種思路:
1、給處於可執行狀態的進程分配時間片(按照優先級),用完時間片的進程被放到“過期隊列”中。等可執行狀態的進程都過期了,再重新分配時間片;
2、動態調整進程的優先級。隨着進程在CPU上運行,其優先級被不斷調低,以便其他優先級較低的進程得到運行機會;(老化)
   後一種方式有更小的調度粒度,並且將“公平性”與“動態調整優先級”兩件事情合而爲一,大大簡化了內核調度程序的代碼。因此,這種方式也成爲內核調度程序的新寵。



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