調度算法
在多道程序環境中,主存中有著多個進程。其數目往往多於處理機數量。這就要求系統能依照某種算法。動態地把處理機分配給就緒隊列中的一個進程,使之運行,分配處理機的任務是由處理機調度程序完畢的。
處理機調度
在多道程序系統中。一個作業被提交後必須經過處理機調度後,方能獲得處理機運行。對於批量型作業而言,通常須要經歷作業調度(也稱為高級調度)和進程調度(也稱為低級調度)兩個過程才幹獲得處理機;而對於終端型作業而言。通常僅僅須要經過進程調度就能夠獲得處理機。除了上述兩種調度。操作系統中往往也設置了中級調度。用來提高內存的利用率。
以下我們分別來談談這幾種調度。首先是高級調度。其主要功能就是依據某種算法
作業是一個比程序更為廣泛的概念,它不僅包括了通常的程序和數據,並且配有一份作業說明書。系統就是依據該說明書來對程序的執行進行控制。前面所說的某種算法,就是我們後面會提到的幾種經常使用調度算法。
低級調度用於決定就緒隊列中的哪個進程應該獲得處理機。然後再由分派程序運行把處理機分派給該進程的詳細操作。
中級調度的主要目的是為了提高內存利用率和系統吞吐量。
它的工作原理就是將臨時不能執行的進程調至外存上去,此時的狀態稱為掛起。相反當內存空暇時,再將他們調回內存,此時的狀態稱為就緒,掛在就緒隊列上等待進程的調度。
三種調度的關系例如以下圖:
那麽我們怎樣評價不同的調度算法呢?為了比較各算法的性能,人們提出了非常多評價準則:
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。在使用完一個時間片後,即使進程並未完畢其執行,它也必須釋放出(被剝奪)處理機給下一個就緒的進程,而被剝奪的進程返回到就緒隊列的末尾又一次排隊。等候再次執行。
在時間片輪轉調度算法中,時間片的大小對系統性能的影響非常大。假設時間片足夠大,以至於全部進程都能在一個時間片內執行完成,則時間片輪轉調度算法就退化為先來先服務調度算法。假設時間片非常小,那麽處理機將在進程間過於頻繁切換,使處理機的開銷增大,而真正用於執行用戶進程的時間將降低。
因此時間片的大小應選擇適當。
調度算法