在每本介紹操作系統的書中,各類調度算法都占據了很大的篇幅,僅從此處我們可以看出
各類調度算法的重要性。而這些調度算法除了在操作系統的各部分使用外,我們也可以將
它們背后蘊含的邏輯用在其他地方,下面是對操作系統中設計的各類調度算法的一個系統
性的總結:
適用於作業與進程的調度算法:
1.先來先服務(FCFS)算法
(1)對於作業,FCFS算法總是從后備作業隊列中選擇最先進入該隊列的一個或多個作業,將
它們調入內存,分配資源,創建進程並放入就緒隊列
對於進程,FCFS算法總是選擇最先進入就緒隊列的進程,將處理器分配給它
(2)FCFS算法屬於不可剝奪算法,對所用進程都是公平的
(3)FCFS算法簡單,但效率低,有利於CPU忙型作業而不利於I/O忙型作業
2.短作業優先(SJF)調度算法
(1)對於作業,SJF算法選擇一個或多個估計運行時間最短的作業調入內存
對於進程,SJF算法從就緒隊列中選擇一個估計運行時間最短的進程將處理器分配給它
(2)對長作業不利,可能造成 飢餓 現象
(3)SJF調度算法的平均等待時間、平均周轉時間最短
(4)SJF調度算法使用的是對未來的估計,難以實現或者不能保證准確
3.優先級調度算法
(1)使用優先級表示作業或進程的緊迫程度,選擇優先級最高的作用或進程調入內存或分配
處理器(注意:優先級常用數字表示,但並不一定數字越大優先級越高,需要看具體定義)
(2)根據高優先級進程能否搶占低優先級進程可將該調度算法分為:
非剝奪式優先級調度算法:當一個進程在處理器運行時,即使有一個更高優先級的進程進
入就緒隊列,該高優先級的進程也必須等待低優先級進程退出處理器才能獲取處理器
剝奪式優先級調度算法:當一個進程在處理器運行時,當有一個更高優先級的進程進入
就緒隊列后,暫停正在運行的進程而將處理器分配給高優先級的進程
(3)根據進程優先級能否改變分為:
靜態優先級:優先級在進程創建時確定,在進程整個運行期中保持不變
動態優先級:根據進程運行狀況動態調整進程優先級
(4)優先級調度算法可能會導致 飢餓
(5)一般系統進程優先級大於用戶進程,交互型進程大於非交互型進程,I/O進程大於計算型進程
4.高響應比優先調度算法
(1)主要用於作業調度,是FCFS與SJF的綜合平衡,同時考慮了每個進程的等待時間與估計運行
時間,在每次作業調度時,先計算各作業響應比,選擇響應比最高的作業調入內存
(2)響應比 = (等待時間 + 要求服務時間) / 要求服務時間
(3)高響應比優先算法克服了飢餓狀態,兼顧了長作業
5.時間片輪轉調度算法
(1)時間片輪轉調度算法主要適用於分時系統
(2)類似於FCFS算法,但每個進程僅能運行一個時間片,當進程時間片用完后,無論該進程是否
完成,必須釋放處理器給就緒隊列中的下一個進程,而自身進入就緒隊列末尾排隊,屬於剝
奪式調度算法
(3)時間片的大小對算法性能影響很大,過大的時間片使得每個進程在一個時間片中運行完成,
也就使該算法退化為FCFS,過小的時間片,會使得花費在調度上的時間過多
(4)時間片的選擇通常由系統響應時間、就緒隊列中進程數目、系統的處理能力共同決定
6.多級反饋隊列調度算法
(1)多級反饋隊列調度算法是時間片輪轉調度算法與優先級調度算法的綜合,通過動態調整優先
級與時間片的大小,該算法可兼顧多個方面,且不必估計進程運行時間
(2)多級反饋隊列調度算法的實現通過設置多個就緒隊列,每個隊列的優先級不同,高優先級隊
列中每個進程分配的時間片越小,每個進程最先進入優先級最高的就緒隊列末尾,當該就緒
隊列中進程在屬於該就緒隊列的時間片中未運行完后,進入下一個優先級低一級的就緒隊列
中等待執行。系統總是愛高優先級隊列為空時才執行下一優先級就緒隊列中的進程
(3)多級反饋隊列調度算法對於終端型作業用戶,短作業優先;對於短批處理作業用戶,周轉時
間較短;對於長批處理作業用戶,不會產生飢餓現象
頁面置換算法
1.最佳(OPT)置換算法
(1)選擇以后不會被使用或最長時間內不再被訪問的頁面換出,以保證最低的缺頁率
(2)由於是對未來的預測,該算法無法實現,但OPT常被用於評價其他算法
2.先進先出(FIFO)頁面置換算法
(1)選擇最先進入內存的頁面(在內存中滯留時間最長度的頁面)換出
(2)FIFO實現簡單,但該算法可能出現當所分配的物理塊越多頁面故障數不增反減的現象,稱為
Belady異常
3.最近最久未使用(LRU)置換算法
(1)選擇最近最長時間未被訪問的頁面換出,該算法認為過去一段時間未被訪問的頁面在將來也
不會被訪問,采用過去預測將來
(2)LRU算法性能較好,但需要寄存器和棧的硬件支持,屬於堆棧類算法,不會出現 Belady異常
(3)LRU性能接近OPT,但實現困難,且開銷大
4.時鍾(CLOCK)置換算法
(1)簡單的CLOCk算法為每幀關聯一個附加位,稱為使用位。當頁面首次裝入內存時,該位為 1,
當該頁面隨后又被訪問時,也將使用位置為 1,將被換出的幀根據進入內存時間先后形成一
個循環緩沖區,有一個指針與該緩沖區相關聯,最初該指針指向第一個進入內存的幀,當要
選擇某一幀換出時,該指針循環掃描該緩沖區,將其遇到的第一個使用位為0的幀換出,該指
針指向被換出幀的下一個幀,被該指針掃過的幀,使用位從1變為0
(2)CLOCK算法性能比較接近LRU算法
(3)為每個幀繼續添加附加位,用於標識各個狀態,形成各個改進的CLOCK算法
磁盤調度算法:
1.先來先服務(FCFS)
(1)最簡單的磁盤調度算法,根據進程訪問磁盤的先后順序進行調度
(2)FCFS具有公平性,在少量進程訪問簇聚的文件扇區時有較好性能,但若大量進程競爭使用磁盤
則性能接近隨機調度
2.最短尋找時間優先(SSTF)
(1)SSTF選擇與當前磁頭距離最近的磁道,以便每次尋找時間最短
(2)SSTF可能產生飢餓現象
3.掃描算法(SCAN)
(1)SCAN算法在當前磁頭移動方向上選擇與當前磁頭距離最近的請求作為下一次服務對象
(2)SCAN算法對最近掃描過的區域不公平,在訪問的局部性方面不如FCFS、SSTF
4.循環掃描算法(C-SCAN)
(1)C-SCAN在SCAN算法的基礎上規定磁頭單向移動提供服務,回返時直接快速移動到起始端
(2)SCAN與C-SCAN的改進:磁頭移動只需要達到最遠端的一個請求即可返回,不需要達到磁盤端點,稱
為LOOK調度和C-LOOK調度
(3)SCAN與C-SCAN在磁盤負載較大時比較占優勢