【Linux系统编程】进程常用调度算法
00. 目錄
文章目錄
- 00. 目錄
- 01. 概述
- 02. 先來先服務(wù)調(diào)度算法
- 03. 時間片輪轉(zhuǎn)調(diào)度法
- 04. 短作業(yè)(SJF)優(yōu)先調(diào)度算法
- 05. 最短剩余時間優(yōu)先
- 06. 高響應(yīng)比優(yōu)先調(diào)度算法
- 07. 優(yōu)先級調(diào)度算法
- 08. 多級反饋隊(duì)列調(diào)度算法
01. 概述
調(diào)度算法是指:根據(jù)系統(tǒng)的資源分配策略所規(guī)定的資源分配算法
02. 先來先服務(wù)調(diào)度算法
? 先來先服務(wù)調(diào)度算法是一種最簡單的調(diào)度算法,也稱為先進(jìn)先出或嚴(yán)格排隊(duì)方案。當(dāng)每個進(jìn)程就緒后,它加入就緒隊(duì)列。當(dāng)前正運(yùn)行的進(jìn)程停止執(zhí)行,選擇在就緒隊(duì)列中存在時間最長的進(jìn)程運(yùn)行。該算法既可以用于作業(yè)調(diào)度,也可以用于進(jìn)程調(diào)度。先來先去服務(wù)比較適合于常作業(yè)(進(jìn)程),而不利于段作業(yè)(進(jìn)程)。
FCFS調(diào)度算法是一種最簡單的調(diào)度算法,該調(diào)度算法既可以用于作業(yè)調(diào)度也可以用于進(jìn)程調(diào)度。在作業(yè)調(diào)度中,算法每次從后備作業(yè)隊(duì)列中選擇最先進(jìn)入該隊(duì)列的一個或幾個作業(yè),將它們調(diào)入內(nèi)存,分配必要的資源,創(chuàng)建進(jìn)程并放入就緒隊(duì)列。
? 在進(jìn)程調(diào)度中,FCFS調(diào)度算法每次從就緒隊(duì)列中選擇最先進(jìn)入該隊(duì)列的進(jìn)程,將處理機(jī)分配給它,使之投入運(yùn)行,直到完成或因某種原因而阻塞時才釋放處理機(jī)。
? 下面通過一個實(shí)例來說明FCFS調(diào)度算法的性能。假設(shè)系統(tǒng)中有4個作業(yè),它們的提交時間分別是8、8.4、8.8、9,運(yùn)行時間依次是2、1、0.5、0.2,系統(tǒng)釆用FCFS調(diào)度算法,這組作業(yè)的平均等待時間、平均周轉(zhuǎn)時間和平均帶權(quán)周轉(zhuǎn)時間如下表所示。
| 1 | 8 | 2 | 8 | 0 | 10 | 2 | 1 |
| 2 | 8.4 | 1 | 10 | 1.6 | 11 | 2.6 | 2.6 |
| 3 | 8.8 | 0.5 | 11 | 2.2 | 11.5 | 2.7 | 5.4 |
| 4 | 9 | 0.2 | 11.5 | 2.5 | 11.7 | 2.7 | 13.5 |
平均等待時間 t = (0+1.6+2.2+2.5)/4=1.575
平均周轉(zhuǎn)時間 T = (2+2.6+2.7+2.7)/4=2.5
平均帶權(quán)周轉(zhuǎn)時間 W = (1+2.6+5.牡13.5)/4=5.625
? FCFS調(diào)度算法屬于不可剝奪算法。從表面上看,它對所有作業(yè)都是公平的,但若一個長作業(yè)先到達(dá)系統(tǒng),就會使后面許多短作業(yè)等待很長時間,因此它不能作為分時系統(tǒng)和實(shí)時系統(tǒng)的主要調(diào)度策略。但它常被結(jié)合在其他調(diào)度策略中使用。例如,在使用優(yōu)先級作為調(diào)度策略的系統(tǒng)中,往往對多個具有相同優(yōu)先級的進(jìn)程按FCFS原則處理。
? FCFS調(diào)度算法的特點(diǎn)是算法簡單,但效率低;對長作業(yè)比較有利,但對短作業(yè)不利(相對SJF和高響應(yīng)比);有利于CPU繁忙型作業(yè),而不利于I/O繁忙型作業(yè)。
03. 時間片輪轉(zhuǎn)調(diào)度法
時間片輪轉(zhuǎn)調(diào)度算法主要適用于分時系統(tǒng)。在這種算法中,系統(tǒng)將所有就緒進(jìn)程按到達(dá)時間的先后次序排成一個隊(duì)列,進(jìn)程調(diào)度程序總是選擇就緒隊(duì)列中第一個進(jìn)程執(zhí)行,即先來先服務(wù)的原則,但僅能運(yùn)行一個時間片,如100ms。在使用完一個時間片后,即使進(jìn)程并未完成其運(yùn)行,它也必須釋放出(被剝奪)處理機(jī)給下一個就緒的進(jìn)程,而被剝奪的進(jìn)程返回到就緒隊(duì)列的末尾重新排隊(duì),等候再次運(yùn)行。
? 在時間片輪轉(zhuǎn)調(diào)度算法中,時間片的大小對系統(tǒng)性能的影響很大。如果時間片足夠大,以至于所有進(jìn)程都能在一個時間片內(nèi)執(zhí)行完畢,則時間片輪轉(zhuǎn)調(diào)度算法就退化為先來先服務(wù)調(diào)度算法。如果時間片很小,那么處理機(jī)將在進(jìn)程間過于頻繁切換,使處理機(jī)的開銷增大,而真正用于運(yùn)行用戶進(jìn)程的時間將減少。因此時間片的大小應(yīng)選擇適當(dāng)。
? 時間片的長短通常由以下因素確定:系統(tǒng)的響應(yīng)時間、就緒隊(duì)列中的進(jìn)程數(shù)目和系統(tǒng)的處理能力。
04. 短作業(yè)(SJF)優(yōu)先調(diào)度算法
? 短作業(yè)(進(jìn)程)優(yōu)先調(diào)度算法是指對短作業(yè)(進(jìn)程)優(yōu)先調(diào)度的算法。短作業(yè)優(yōu)先(SJF)調(diào)度算法是從后備隊(duì)列中選擇一個或若干個估計運(yùn)行時間最短的作業(yè),將它們調(diào)入內(nèi)存運(yùn)行。而短進(jìn)程優(yōu)先(SPF)調(diào)度算法,則是從就緒隊(duì)列中選擇一個估計運(yùn)行時間最短的進(jìn)程,將處理機(jī)分配給它,使之立即執(zhí)行,直到完成或發(fā)生某事件而阻塞時,才釋放處理機(jī)。
? 短作業(yè)優(yōu)先調(diào)度算法是一個非搶占策略,他的原則是下一次選擇預(yù)計處理時間最短的進(jìn)程,因此短進(jìn)程將會越過長作業(yè),跳至隊(duì)列頭。該算法即可用于作業(yè)調(diào)度,也可用于進(jìn)程調(diào)度。但是他對長作業(yè)不利,不能保證緊迫性作業(yè)(進(jìn)程)被及時處理,作業(yè)的長短只是被估算出來的。
缺點(diǎn):
- 該算法對長作業(yè)不利,SJF調(diào)度算法中長作業(yè)的周轉(zhuǎn)時間會增加。更嚴(yán)重的是,如果有一長作業(yè)進(jìn)入系統(tǒng)的后備隊(duì)列,由于調(diào)度程序總是優(yōu)先調(diào)度那些 (即使是后進(jìn)來的)短作業(yè),將導(dǎo)致長作業(yè)長期不被調(diào)度(“饑餓”現(xiàn)象,注意區(qū)分“死鎖”。后者是系統(tǒng)環(huán)形等待,前者是調(diào)度策略問題)。
- 該算法完全未考慮作業(yè)的緊迫程度,因而不能保證緊迫性作業(yè)會被及時處理。
- 由于作業(yè)的長短只是根據(jù)用戶所提供的估計執(zhí)行時間而定的,而用戶又可能會有意或無意地縮短其作業(yè)的估計運(yùn)行時間,致使該算法不一定能真正做到短作業(yè)優(yōu)先調(diào)度。
【注意】 SJF調(diào)度算法的平均等待時間、平均周轉(zhuǎn)時間最少。
05. 最短剩余時間優(yōu)先
? 最短剩余時間是針對最短進(jìn)程優(yōu)先增加了搶占機(jī)制的版本。在這種情況下,進(jìn)程調(diào)度總是選擇預(yù)期剩余時間最短的進(jìn)程。當(dāng)一個進(jìn)程加入到就緒隊(duì)列時,他可能比當(dāng)前運(yùn)行的進(jìn)程具有更短的剩余時間,因此只要新進(jìn)程就緒,調(diào)度程序就能可能搶占當(dāng)前正在運(yùn)行的進(jìn)程。像最短進(jìn)程優(yōu)先一樣,調(diào)度程序正在執(zhí)行選擇函數(shù)是必須有關(guān)于處理時間的估計,并且存在長進(jìn)程饑餓的危險。
06. 高響應(yīng)比優(yōu)先調(diào)度算法
? 根據(jù)比率:R=(w+s)/s (R為響應(yīng)比,w為等待處理的時間,s為預(yù)計的服務(wù)時間)
如果該進(jìn)程被立即調(diào)用,則R值等于歸一化周轉(zhuǎn)時間(周轉(zhuǎn)時間和服務(wù)時間的比率)。R最小值為1.0,只有第一個進(jìn)入系統(tǒng)的進(jìn)程才能達(dá)到該值。調(diào)度規(guī)則為:當(dāng)前進(jìn)程完成或被阻塞時,選擇R值最大的就緒進(jìn)程,它說明了進(jìn)程的年齡。當(dāng)偏向短作業(yè)時,長進(jìn)程由于得不到服務(wù),等待時間不斷增加,從而增加比值,最終在競爭中贏了短進(jìn)程。和最短進(jìn)程優(yōu)先、最短剩余時間優(yōu)先一樣,使用最高響應(yīng)比策略需要估計預(yù)計服務(wù)時間。
? 高響應(yīng)比優(yōu)先調(diào)度算法主要用于作業(yè)調(diào)度,該算法是對FCFS調(diào)度算法和SJF調(diào)度算法的一種綜合平衡,同時考慮每個作業(yè)的等待時間和估計的運(yùn)行時間。在每次進(jìn)行作業(yè)調(diào)度時,先計算后備作業(yè)隊(duì)列中每個作業(yè)的響應(yīng)比,從中選出響應(yīng)比最高的作業(yè)投入運(yùn)行。
根據(jù)公式可知:
- 當(dāng)作業(yè)的等待時間相同時,則要求服務(wù)時間越短,其響應(yīng)比越高,有利于短作業(yè)。
- 當(dāng)要求服務(wù)時間相同時,作業(yè)的響應(yīng)比由其等待時間決定,等待時間越長,其響應(yīng)比越高,因而它實(shí)現(xiàn)的是先來先服務(wù)。
- 對于長作業(yè),作業(yè)的響應(yīng)比可以隨等待時間的增加而提高,當(dāng)其等待時間足夠長時,其響應(yīng)比便可升到很高,從而也可獲得處理機(jī)??朔损囸I狀態(tài),兼顧了長作業(yè)。
07. 優(yōu)先級調(diào)度算法
優(yōu)先級調(diào)度算法又稱優(yōu)先權(quán)調(diào)度算法,該算法既可以用于作業(yè)調(diào)度,也可以用于進(jìn)程調(diào)度,該算法中的優(yōu)先級用于描述作業(yè)運(yùn)行的緊迫程度。
在作業(yè)調(diào)度中,優(yōu)先級調(diào)度算法每次從后備作業(yè)隊(duì)列中選擇優(yōu)先級最髙的一個或幾個作業(yè),將它們調(diào)入內(nèi)存,分配必要的資源,創(chuàng)建進(jìn)程并放入就緒隊(duì)列。在進(jìn)程調(diào)度中,優(yōu)先級調(diào)度算法每次從就緒隊(duì)列中選擇優(yōu)先級最高的進(jìn)程,將處理機(jī)分配給它,使之投入運(yùn)行。
根據(jù)新的更高優(yōu)先級進(jìn)程能否搶占正在執(zhí)行的進(jìn)程,可將該調(diào)度算法分為:
- 非剝奪式優(yōu)先級調(diào)度算法。當(dāng)某一個進(jìn)程正在處理機(jī)上運(yùn)行時,即使有某個更為重要或緊迫的進(jìn)程進(jìn)入就緒隊(duì)列,仍然讓正在運(yùn)行的進(jìn)程繼續(xù)運(yùn)行,直到由于其自身的原因而主動讓出處理機(jī)時(任務(wù)完成或等待事件),才把處理機(jī)分配給更為重要或緊迫的進(jìn)程。
- 剝奪式優(yōu)先級調(diào)度算法。當(dāng)一個進(jìn)程正在處理機(jī)上運(yùn)行時,若有某個更為重要或緊迫的進(jìn)程進(jìn)入就緒隊(duì)列,則立即暫停正在運(yùn)行的進(jìn)程,將處理機(jī)分配給更重要或緊迫的進(jìn)程。
而根據(jù)進(jìn)程創(chuàng)建后其優(yōu)先級是否可以改變,可以將進(jìn)程優(yōu)先級分為以下兩種:
-
靜態(tài)優(yōu)先級。優(yōu)先級是在創(chuàng)建進(jìn)程時確定的,且在進(jìn)程的整個運(yùn)行期間保持不變。確定靜態(tài)優(yōu)先級的主要依據(jù)有進(jìn)程類型、進(jìn)程對資源的要求、用戶要求。
-
動態(tài)優(yōu)先級。在進(jìn)程運(yùn)行過程中,根據(jù)進(jìn)程情況的變化動態(tài)調(diào)整優(yōu)先級。動態(tài)調(diào)整優(yōu)先級的主要依據(jù)為進(jìn)程占有CPU時間的長短、就緒進(jìn)程等待CPU時間的長短。
08. 多級反饋隊(duì)列調(diào)度算法
多級反饋隊(duì)列算法,不必事先知道各種進(jìn)程所需要執(zhí)行的時間,他是當(dāng)前被公認(rèn)的一種較好的進(jìn)程調(diào)度算法。
多級反饋隊(duì)列調(diào)度算法的實(shí)現(xiàn)思想如下:
多級反饋隊(duì)列的優(yōu)勢有:
- 終端型作業(yè)用戶:短作業(yè)優(yōu)先。
- 短批處理作業(yè)用戶:周轉(zhuǎn)時間較短。
- 長批處理作業(yè)用戶:經(jīng)過前面幾個隊(duì)列得到部分執(zhí)行,不會長期得不到處理。
總結(jié)
以上是生活随笔為你收集整理的【Linux系统编程】进程常用调度算法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【C语言】控制台窗口图形界面编程(六):
- 下一篇: linux 其他常用命令