操作系統中的進程調度算法有哪些?
調度程序是操作系統內核的組成部分,它負責選擇下一個要運行的進程。所以調度策略就決定了這個操作系統的是非實時還是實時的操作系統。當今操作系統的種類繁多,但進程調度算法可以總結為一下幾種。
先來先服務調度算法(FCFS)
先來先服務的調度策略非常的簡單。維護一個就緒隊列,每次調度是從就緒隊列中選擇一個最先進入該隊列的進程,為之分配處理機,使之投入運行。該進程一直運行到完成或發生某事件而阻塞后才放棄處理機。
短進程優先調度算法(SPF)
短進程優先(SPF)調度算法則是從就緒隊列中選出一個估計運行時間最短的進程,將處理機分配給它,使它立即執行并一直執行到完成,或發生某事件而被阻塞放棄處理機時再重新調度。
高優先權優先調度算法
為了照顧緊迫型的進程,能讓這些進程得到優先的運行,所以引入了優先權優先調度算法。這種調度算法可以用在實時操作系統上。當進程調度發生時,該算法把處理機分配給就緒隊列中優先級最高的進程。
該算法有兩種類型:
非搶占式優先權算法:在這種模式下,系統一旦把處理機分配給了就緒隊列中某個優先級最高的進程,這個進程就會一直運行下去,直到進程結束;或者是主動放棄處理機,系統才會將處理機分配給另一個優先級最高的進程。這種算法可用于某些對實時性要求不高的操作系統中。
搶占式優先權調度算法:在這種模式下,系統同樣是把處理機分配給優先級最高進程,然后運行。但是如果在運行期間,就緒隊列中出現了優先級更高的進程,系統就會立即停止當前運行的進程,重新將處理機分配給新加入的優先級更高的進程。所以在這種模式下,可以更好的滿足實時性的要求,故常用在實時性要求高的系統中。
想象下高優先進程由于因資源缺乏而處于受阻狀態,一直等到低優先級進程釋放資源為止。而低優先級獲得的CPU時間少,如果此時有優先級處于兩者之間的任務,并且不需要那個共享資源,則該中優先級的進程反而超過這兩個進程而獲得CPU時間。如果高優先級等待資源時不是阻塞等待,而是忙循環,則可能永遠無法獲得資源,因為此時低優先級進程無法與高優先級進程爭奪CPU時間,從而無法執行,進而無法釋放資源,造成的后果就是高優先級進程無法獲得資源而繼續推進。我們把這種現象稱之為:優先級翻轉。
怎么解決上述問題呢?
有三種方法:
設置優先級上限,給臨界區一個高優先級,進入臨界區的進程都將獲得這個高優先級,如果其他試圖進入臨界區的進程的優先級都低于這個高優先級,那么優先級反轉就不會發生。
優先級繼承,當一個高優先級進程等待一個低優先級進程持有的資源時,低優先級進程將暫時獲得高優先級進程的優先級別,在釋放共享資源后,低優先級進程回到原來的優先級別。嵌入式系統VxWorks就是采用這種策略。
第三種方法就是臨界區禁止中斷,通過禁止中斷來保護臨界區,采用此種策略的系統只有兩種優先級:可搶占優先級和中斷禁止優先級。前者為一般進程運行時的優先級,后者為運行于臨界區的優先級?;鹦翘铰氛哒怯捎谠谂R界區中運行的氣象任務被中斷發生的通信任務所搶占才導致故障,如果有臨界區的禁止中斷保護,此一問題也不會發生。
高響應比優先調度算法
在CPU密集型系統中,短進程優先級算法是比較好的一種算法。但是長進程的運行時得不到確定保證的。該怎么解決這個問題呢?我們是不是可以引入一種動態優先級,用大白話說等待的時間越長,優先級就會變得越高。所以,等待了一段時間之后,就會一定輪到運行的。但是其中的這個動態計算優先級的算法是需要消耗CPU資源的。
時間片輪轉
在早期的時間片輪轉法中,系統將所有的就緒進程按先來先服務的原則排成一個隊列,每次調度時,把CPU 分配給隊首進程,并令其執行一個時間片。時間片的大小從幾ms 到幾百ms。當執行的時間片用完時,由一個計時器發出時鐘中斷請求,調度程序便據此信號來停止該進程的執行,并將它送往就緒隊列的末尾;然后,再把處理機分配給就緒隊列中新的隊首進程,同時也讓它執行一個時間片。這樣就可以保證就緒隊列中的所有進程在一給定的時間內均能獲得一時間片的處理機執行時間。換言之,系統能在給定的時間內響應所有用戶的請求。
多級反饋隊列調度算法
我們之前講的調度算法都有一定的局限性。如短進程優先調度算法,僅照顧了短進程,而忽略了長進程。而多級反饋隊列調度算法,是一種均衡的,能夠滿足各類進程的需要。所以是目前比較好的進程調度算法。
設置多個就緒隊列,并且每個隊列的優先等級不一樣。第一隊列優先級最高,第二隊列優先級次之,以此類推。優先級越高隊列,時間片就最短。
當一個新進程進入內存后,首先將它放入第一隊列的末尾,按FCFS原則排隊等待調度。當輪到該進程執行時,如它能在該時間片內完成,便可準備撤離系統;如果它在一個時間片結束時尚未完成,調度程序便將該進程轉入第二隊列的末尾,再同樣地按FCFS原則等待調度執行;如果它在第二隊列中運行一個時間片后仍未完成,再依次將它放入第三隊列,……,如此下去,當一個長作業(進程)從第一隊列依次降到第n隊列后,在第n 隊列便采取按時間片輪轉的方式運行。
僅當第一隊列空閑時,調度程序才調度第二隊列中的進程運行;僅當第1~(i-1)隊列均空時,才會調度第i隊列中的進程運行。如果處理機正在第i隊列中為某進程服務時,又有新進程進入優先權較高的隊列(第1~(i-1)中的任何一個隊列),則此時新進程將搶占正在運行進程的處理機,即由調度程序把正在運行的進程放回到第i隊列的末尾,把處理機分配給新到的高優先權進程。如下圖:
參考
https://blog.csdn.net/qq_35642036/article/details/82809812,源理君參考了這篇文章。
總結
本文講了幾種進程調度算法,希望對進程調度算法有興趣的朋友們,有所幫助。當然還有本文沒有談到的調度算法,如:彩票調度,單比率調度等等。