常見的操作系統進程調度算法

一、先來先服務和短作業(進程)優先調度算法
1.先來先服務調度算法
先來先服務(FCFS)調度算法是一種最簡單的調度算法,該算法既可用於作業調度,也可用於進程調度。當在作業調度中採用該算法時,每次調度都是從後備作業隊列中選擇一個或多個最先進入該隊列的作業,將它們調入內存,爲它們分配資源、創建進程,然後放入就緒隊列。在進程調度中採用FCFS算法時,則每次調度是從就緒隊列中選擇一個最先進入該隊列的進程,爲之分配處理機,使之投入運行。該進程一直運行到完成或發生某事件而阻塞後才放棄處理機。

2.短作業(進程)優先調度算法
短作業(進程)優先調度算法SJ(P)F,是指對短作業或短進程優先調度的算法。它們可以分別用於作業調度和進程調度。短作業優先(SJF)的調度算法是從後備隊列中選擇一個或若干個估計運行時間最短的作業,將它們調入內存運行。而短進程優先(SPF)調度算法則是從就緒隊列中選出一個估計運行時間最短的進程,將處理機分配給它,使它立即執行並一直執行到完成,或發生某事件而被阻塞放棄處理機時再重新調度。

二、高優先權優先調度算法
1.優先權調度算法的類型
爲了照顧緊迫型作業,使之在進入系統後便獲得優先處理,引入了最高優先權優先(FPF)調度算法。此算法常被用於批處理系統中,作爲作業調度算法,也作爲多種操作系統中的進程調度算法,還可用於實時系統中。當把該算法用於作業調度時,系統將從後備隊列中選擇若干個優先權最高的作業裝入內存。當用於進程調度時,該算法是把處理機分配給就緒隊列中優先權最高的進程,這時,又可進一步把該算法分成如下兩種。

1) 非搶佔式優先權算法

在這種方式下,系統一旦把處理機分配給就緒隊列中優先權最高的進程後,該進程便一直執行下去,直至完成;或因發生某事件使該進程放棄處理機時,系統方可再將處理機重新分配給另一優先權最高的進程。這種調度算法主要用於批處理系統中;也可用於某些對實時性要求不嚴的實時系統中。

2) 搶佔式優先權調度算法

在這種方式下,系統同樣是把處理機分配給優先權最高的進程,使之執行。但在其執行期間,只要又出現了另一個其優先權更高的進程,進程調度程序就立即停止當前進程(原優先權最高的進程)的執行,重新將處理機分配給新到的優先權最高的進程。因此,在採用這種調度算法時,是每當系統中出現一個新的就緒進程i 時,就將其優先權Pi與正在執行的進程j 的優先權Pj進行比較。如果Pi≤Pj,原進程Pj便繼續執行;但如果是Pi>Pj,則立即停止Pj的執行,做進程切換,使i 進程投入執行。顯然,這種搶佔式的優先權調度算法能更好地滿足緊迫作業的要求,故而常用於要求比較嚴格的實時系統中,以及對性能要求較高的批處理和分時系統中。

2.高響應比優先調度算法

在批處理系統中,短作業優先算法是一種比較好的算法,其主要的不足之處是長作業的運行得不到保證。如果我們能爲每個作業引入前面所述的動態優先權,並使作業的優先級隨着等待時間的增加而以速率a 提高,則長作業在等待一定的時間後,必然有機會分配到處理機。該優先權的變化規律可描述爲:


由於等待時間與服務時間之和就是系統對該作業的響應時間,故該優先權又相當於響應比RP。據此,又可表示爲:


具體算法過程舉例如下:









由上式可以看出:

(1) 如果作業的等待時間相同,則要求服務的時間愈短,其優先權愈高,因而該算法有利於短作業。

(2) 當要求服務的時間相同時,作業的優先權決定於其等待時間,等待時間愈長,其優先權愈高,因而它實現的是先來先服務。

(3) 對於長作業,作業的優先級可以隨等待時間的增加而提高,當其等待時間足夠長時,其優先級便可升到很高,從而也可獲得處理機。簡言之,該算法既照顧了短作業,又考慮了作業到達的先後次序,不會使長作業長期得不到服務。因此,該算法實現了一種較好的折衷。當然,在利用該算法時,每要進行調度之前,都須先做響應比的計算,這會增加系統開銷。

三、基於時間片的輪轉調度算法
1.時間片輪轉法
1) 基本原理

在早期的時間片輪轉法中,系統將所有的就緒進程按先來先服務的原則排成一個隊列,每次調度時,把CPU 分配給隊首進程,並令其執行一個時間片。時間片的大小從幾ms 到幾百ms。當執行的時間片用完時,由一個計時器發出時鐘中斷請求,調度程序便據此信號來停止該進程的執行,並將它送往就緒隊列的末尾;然後,再把處理機分配給就緒隊列中新的隊首進程,同時也讓它執行一個時間片。這樣就可以保證就緒隊列中的所有進程在一給定的時間內均能獲得一時間片的處理機執行時間。換言之,系統能在給定的時間內響應所有用戶的請求。

2.多級反饋隊列調度算法
前面介紹的各種用作進程調度的算法都有一定的侷限性。如短進程優先的調度算法,僅照顧了短進程而忽略了長進程,而且如果並未指明進程的長度,則短進程優先和基於進程長度的搶佔式調度算法都將無法使用。而多級反饋隊列調度算法則不必事先知道各種進程所需的執行時間,而且還可以滿足各種類型進程的需要,因而它是目前被公認的一種較好的進程調度算法。在採用多級反饋隊列調度算法的系統中,調度算法的實施過程如下所述。

(1) 應設置多個就緒隊列,併爲各個隊列賦予不同的優先級。第一個隊列的優先級最高,第二個隊列次之,其餘各隊列的優先權逐個降低。該算法賦予各個隊列中進程執行時間片的大小也各不相同,在優先權愈高的隊列中,爲每個進程所規定的執行時間片就愈小。例如,第二個隊列的時間片要比第一個隊列的時間片長一倍,……,第i+1個隊列的時間片要比第i個隊列的時間片長一倍。

(2) 當一個新進程進入內存後,首先將它放入第一隊列的末尾,按FCFS原則排隊等待調度。當輪到該進程執行時,如它能在該時間片內完成,便可準備撤離系統;如果它在一個時間片結束時尚未完成,調度程序便將該進程轉入第二隊列的末尾,再同樣地按FCFS原則等待調度執行;如果它在第二隊列中運行一個時間片後仍未完成,再依次將它放入第三隊列,……,如此下去,當一個長作業(進程)從第一隊列依次降到第n隊列後,在第n 隊列便採取按時間片輪轉的方式運行。

(3) 僅當第一隊列空閒時,調度程序才調度第二隊列中的進程運行;僅當第1~(i-1)隊列均空時,纔會調度第i隊列中的進程運行。如果處理機正在第i隊列中爲某進程服務時,又有新進程進入優先權較高的隊列(第1~(i-1)中的任何一個隊列),則此時新進程將搶佔正在運行進程的處理機,即由調度程序把正在運行的進程放回到第i隊列的末尾,把處理機分配給新到的高優先權進程。



linux內核的三種調度方法:
1. SCHED_OTHER 分時調度策略,
2. SCHED_FIFO實時調度策略,先到先服務
3. SCHED_RR實時調度策略,時間片輪轉
實時進程將得到優先調用,實時進程根據實時優先級決定調度權值,分時進程則通過nice和counter值決
定權值,nice越小,counter越大,被調度的概率越大,也就是曾經使用了cpu最少的進程將會得到優先調
度。
SHCED_RR和SCHED_FIFO的不同:
當採用SHCED_RR策略的進程的時間片用完,系統將重新分配時間片,並置於就緒隊列尾。放在隊列
尾保證了所有具有相同優先級的RR任務的調度公平。
SCHED_FIFO一旦佔用cpu則一直運行。一直運行直到有更高優先級任務到達或自己放棄。
如果有相同優先級的實時進程(根據優先級計算的調度權值是一樣的)已經準備好,FIFO時必須等待該
進程主動放棄後纔可以運行這個優先級相同的任務。而RR可以讓每個任務都執行一段時間。
SHCED_RR和SCHED_FIFO的相同點:
SHCED_RR和SHCED_FIFO都只用於實時任務。
創建時優先級大於0(1-99)。
按照可搶佔優先級調度算法進行。
就緒態的實時任務立即搶佔非實時任務。
所有任務都採用linux分時調度策略時。
1. 創建任務指定採用分時調度策略,並指定優先級nice值(-20~19)。
2. 將根據每個任務的nice值確定在cpu上的執行時間(counter)。
3. 如果沒有等待資源,則將該任務加入到就緒隊列中。
4. 調度程序遍歷就緒隊列中的任務,通過對每個任務動態優先級的計算(counter+20-nice)結果,選擇
計算結果最大的一個去運行,當這 個時間片用完後(counter減至0)或者主動放棄cpu時,該任務將被放在
就緒隊列末尾(時間片用完)或等待隊列(因等待資源而放棄cpu)中。
5. 此時調度程序重複上面計算過程,轉到第4步。
6. 當調度程序發現所有就緒任務計算所得的權值都爲不大於0時,重複第2步。
所有任務都採用FIFO時:
1. 創建進程時指定採用FIFO,並設置實時優先級rt_priority(1-99)。
2. 如果沒有等待資源,則將該任務加入到就緒隊列中。
3. 調度程序遍歷就緒隊列,根據實時優先級計算調度權值(1000+rt_priority),選擇權值最高的任務使用
cpu,該FIFO任務將一直佔有cpu直到有優先級更高的任務就緒(即使優先級相同也不行)或者主動放棄(等
待資源)。
4. 調度程序發現有優先級更高的任務到達(高優先級任務可能被中斷或定時器任務喚醒,再或被當前運行
的任務喚醒,等等),則調度程序立即在當前任務 堆棧中保存當前cpu寄存器的所有數據,重新從高優先級
任務的堆棧中加載寄存器數據到cpu,此時高優先級的任務開始運行。重複第3步。
5. 如果當前任務因等待資源而主動放棄cpu使用權,則該任務將從就緒隊列中刪除,加入等待隊列,此時
重複第3步。
所有任務都採用RR調度策略時
1. 創建任務時指定調度參數爲RR,並設置任務的實時優先級和nice值(nice值將會轉換爲該任務的時間片
的長度)。
2. 如果沒有等待資源,則將該任務加入到就緒隊列中。
3. 調度程序遍歷就緒隊列,根據實時優先級計算調度權值(1000+rt_priority),選擇權值最高的任務使用
cpu。
4. 如果就緒隊列中的RR任務時間片爲0,則會根據nice值設置該任務的時間片,同時將該任務放入就緒隊
列的末尾。重複步驟3。
5. 當前任務由於等待資源而主動退出cpu,則其加入等待隊列中。重複步驟3。
系統中既有分時調度,又有時間片輪轉調度和先進先出調度
1. RR調度和FIFO調度的進程屬於實時進程,以分時調度的進程是非實時進程。
2. 當實時進程準備就緒後,如果當前cpu正在運行非實時進程,則實時進程立即搶佔非實時進程。
3. RR進程和FIFO進程都採用實時優先級做爲調度的權值標準,RR是FIFO的一個延伸。FIFO時,如果兩
個進程的優先級一樣,則這兩個優先 級一樣的進程具體執行哪一個是由其在隊列中的未知決定的,這樣導
致一些不公正性(優先級是一樣的,爲什麼要讓你一直運行?),如果將兩個優先級一樣的任務 的調度策略都
設爲RR,則保證了這兩個任務可以循環執行,保證了公平。

發佈了30 篇原創文章 · 獲贊 27 · 訪問量 11萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章