調度演算法,資源調度演算法
在多道程式環境中,主存中有著多個進程,其數目往往多於處理機數量。這就要求系統能按照某種演算法,動態地把處理機分配給就緒隊列中的一個進程,使之執行,分配處理機的任務是由處理機發送器完成的。
處理機調度
在多道程式系統中,一個作業被提交後必須經過處理機調度後,方能獲得處理機執行。對於批量型作業而言,通常需要經曆作業調度(也稱為進階調度)和進程調度(也稱為低級調度)兩個過程才能獲得處理機;而對於終端型作業而言,通常只需要經過進程調度就可以獲得處理機。除了上述兩種調度,作業系統中往往也設定了中級調度,用來提高記憶體的利用率。
下面我們分別來談談這幾種調度。首先是進階調度,其主要功能就是根據某種演算法,把外存上處於後備隊列中的那些作業調入記憶體,也就是說,調度的對象是作業。那麼什麼叫做作業呢?
作業是一個比程式更為廣泛的概念,它不僅包含了通常的程式和資料,而且配有一份作業說明書,系統就是根據該說明書來對程式的運行進行控制。前面所說的某種演算法,就是我們後面會提到的幾種常用調度演算法。
低級調度用於決定就緒隊列中的哪個進程應該獲得處理機,然後再由指派程式執行把處理機指派給該進程的具體操作。
中級調度的主要目的是為了提高記憶體利用率和系統輸送量。它的工作原理就是將暫時不能啟動並執行進程調至外存上去,此時的狀態稱為掛起。相反當記憶體空閑時,再將他們調回記憶體,此時的狀態稱為就緒,掛在就緒隊列上等待進程的調度。
三種調度的關係如:
那麼我們如何評價不同的調度演算法呢?為了比較各演算法的效能,人們提出了很多評價準則:
1. cpu利用率:cpu是電腦系統中最重要的昂貴的資源,所以應該儘可能使cpu保持工作狀態;
2. 系統輸送量:單位時間內cpu完成作業的數量,長作業需要消耗較長的處理機時間,所以會降低系統的輸送量;
3. 周轉時間:從作業提交到作業完成所經曆的時間,包括作業等待、在就緒隊列中排隊、在處理機上運行以及進行輸入輸出操作所花費時間的總和。
周轉時間=作業完成時間-作業提交時間
平均周轉時間=(作業1的周轉時間+作業2的周轉時間+…+作業n的周轉時間)/n
帶權周轉時間=周轉時間/作業實際已耗用時間
平均帶權周轉時間=(作業1的帶權周轉時間+…+作業n的帶權周轉時間)/n
4. 等待時間: 是指進程處於等處理機狀態時間之和,等待時間越長,使用者滿意度越低。處理機調度演算法實際上並不影響作業執行或輸入/輸出操作的時間,隻影響作業在就緒隊列中等待所花的時間。因此,衡量一個調度演算法優劣常常只需簡單地考察等待時間。
5. 回應時間: 是指從使用者提交請求到系統首次產生響應所用的時間。在互動式系統中,周轉時間不可能是最好的評價準則,一般釆用回應時間作為衡量調度演算法的重要準則之一。從使用者角度看,調度策略應盡量降低回應時間,使回應時間處在使用者能接受的範圍之內。
下面我們來正式介紹一下作業系統中的幾種常用調度演算法吧:
先來先服務調度演算法
FCFS調度演算法是一種最簡單的調度演算法,該調度演算法既可以用於作業調度也可以用於進程調度。
在作業調度中,演算法每次從後備作業隊列中選擇最先進入該隊列的一個或幾個作業,將它們調入記憶體,分配必要的資源,建立進程並放入就緒隊列。
在進程調度中,FCFS調度演算法每次從就緒隊列中選擇最先進入該隊列的進程,將處理機分配給它,使之投入運行,直到完成或因某種原因而阻塞時才釋放處理機。
下面通過一個執行個體來說明FCFS調度演算法的效能。假設系統中有4個作業,它們的提交時間分別是8、8.4、8.8、9,已耗用時間依次是2、1、0.5、0.2,系統釆用FCFS調度演算法
通過分析可得:
平均等待時間 t = (0+1.6+2.2+2.5)/4=1.575
平均周轉時間 T = (2+2.6+2.7+2.7)/4=2.5
平均帶權周轉時間 W = (1+2.6+5.4+13.5)/4=5.625
從表面上看,它對所有作業都是公平的,但若一個長作業先到達系統,就會使後面許多短作業等待很長時間,因此它不能作為分時系統和即時系統的主要調度策略。但它常被結合在其他調度策略中使用。例如,在使用優先順序作為調度策略的系統中,往往對多個具有相同優先順序的進程按FCFS原則處理。
FCFS調度演算法的特點是演算法簡單,但效率低;對長作業比較有利,但對短作業不利(相對SJF和高響應比);有利於CPU繁忙型作業,而不利於I/O繁忙型作業。
短作業(進程)優先調度演算法
短作業(進程)優先調度演算法是指對短作業(進程)優先調度的演算法。短作業優先(SJF)調度演算法是從後備隊列中選擇一個或若干個估計已耗用時間最短的作業,將它們調入記憶體運行。而短進程優先(SPF)調度演算法,則是從就緒隊列中選擇一個估計已耗用時間最短的進程,將處理機分配給它,使之立即執行,直到完成或發生某事件而阻塞時,才釋放處理機。
還是上面的例子,我們換用短作業法就會得到不一樣的結果:
平均等待時間 t = (0+2.3+1.4+1)/4=1.175
平均周轉時間 T = (2+3.3+1.9+1.2)/4=2.1
平均帶權周轉時間 W = (1+3.3+3.8+6)/4=3.525
看起來短作業優先調度演算法似乎很不錯,但是也存在不容忽視的缺點:
該演算法對長作業不利,SJF調度演算法中長作業的周轉時間會增加。更嚴重的是,如果有一長作業進入系統的後備隊列,由於發送器總是優先調度那些 (即使是後進來的)短作業,將導致長作業長期不被調度(“饑餓”現象,注意區分“死結”。後者是系統環形等待,前者是調度策略問題)。
該演算法完全未考慮作業的緊迫程度,因而不能保證緊迫性作業會被及時處理。
由於作業的長短只是根據使用者所提供的估計執行時間而定的,而使用者又可能會有意或無意地縮短其作業的估計已耗用時間,致使該演算法不一定能真正做到短作業優先調度。
注意,SJF調度演算法的平均等待時間、平均周轉時間最少。
優先順序調度演算法
在作業調度中,優先順序調度演算法每次從後備作業隊列中選擇優先順序最髙的一個或幾個作業,將它們調入記憶體,分配必要的資源,建立進程並放入就緒隊列。在進程調度中,優先順序調度演算法每次從就緒隊列中選擇優先順序最高的進程,將處理機分配給它,使之投入運行。
根據新的更高優先順序進程能否搶佔正在執行的進程,可將該調度演算法分為:
非剝奪式優先順序調度演算法。當某一個進程正在處理機上運行時,即使有某個更為重要或緊迫的進程進入就緒隊列,仍然讓正在啟動並執行進程繼續運行,直到由於其自身的原因而主動讓出處理機時(任務完成或等待事件),才把處理機分配給更為重要或緊迫的進程。
剝奪式優先順序調度演算法。當一個進程正在處理機上運行時,若有某個更為重要或緊迫的進程進入就緒隊列,則立即暫停正在啟動並執行進程,將處理機分配給更重要或緊迫的進程。
而根據進程建立後其優先順序是否可以改變,可以將進程優先順序分為以下兩種:
靜態優先順序。優先順序是在建立進程時確定的,且在進程的整個運行期間保持不變。確定靜態優先順序的主要依據有進程類型、進程對資源的要求、使用者要求。
動態優先順序。在進程運行過程中,根據進程情況的變化動態調整優先順序。動態調整優先順序的主要依據為進程佔有CPU時間的長短、就緒進程等待CPU時間的長短。
基於時間片的輪轉調度演算法
時間片輪轉調度演算法主要適用於分時系統。在這種演算法中,系統將所有就緒進程按到達時間的先後次序排成一個隊列,進程發送器總是選擇就緒隊列中第一個進程執行,即先來先服務的原則,但僅能運行一個時間片,如100ms。在使用完一個時間片後,即使進程並未完成其運行,它也必須釋放出(被剝奪)處理機給下一個就緒的進程,而被剝奪的進程返回到就緒隊列的末尾重新排隊,等候再次運行。
在時間片輪轉調度演算法中,時間片的大小對系統效能的影響很大。如果時間片足夠大,以至於所有進程都能在一個時間片內執行完畢,則時間片輪轉調度演算法就退化為先來先服務調度演算法。如果時間片很小,那麼處理機將在進程間過於頻繁切換,使處理機的開銷增大,而真正用於運行使用者進程的時間將減少。因此時間片的大小應選擇適當。
著作權聲明:本文為博主原創文章,未經博主允許不得轉載。