操作系統:處理機調度


處理機調度

在多道程序環境下內存中存在着多個進程,而計算機的 CPU 資源時有限的,這就要求系統能按某種算法動態地將處理機分配給進程。調度的實質是一種資源分配,處理機調度是對處理機資源進行分配。分配處理機是由處理機調度程序完成的,系統的運行效率如何在很大程度上都取決於處理機調度性能。

處理機調度的層次

一個作業從提交到獲得處理機執行,直至作業運行完畢,可能需要經歷多級處理機調度。

高級調度

高級調度(High Level Scheduling)又稱長程調度或作業調度,調度對象是作業,方向是從外存到內存。主要功能是根據某種算法,決定將外存上處於后備隊列中的哪幾個作業調入內存,為它們創建進程、分配必要的資源,並將它們放入就緒隊列。放入就緒隊列意味着作業獲取競爭 CPU 的權利,調入時建立相對的 PCB,調出時撤銷 PCB。

中級調度

中級調度(Intermediate Scheduling)又稱為內存調度,方向是從外存到內存。主要功能是把那些暫時不能運行的進程掛起,調至外存等待。當它們已具備運行條件且內存又稍有空閑時,通過某種算法將進程再重新調入內存,並修改其狀態為就緒狀態。

低級調度

低級調度(Low Level Scheduling)又稱為進程調度或短程調度,調度的對象是進程(內核級線程),方向是從內存到 CPU。主要功能是根據某種算法,決定就緒隊列中的哪個進程應獲得處理機,並由分派程序將處理機分配給被選中的進程。進程調度是最基本的一種調度,在多道批處理、分時和實時三種類型的 OS 中,都必須配置這級調度。

調度算法效率指標

資源利用率

調度要追求較高的資源李永祿,讓系統中的 CPU 和資源盡可能處於忙碌狀態。

平均周轉時間

周轉時間是指從作業被提交給系統開始,到作業完成為止的這段時間間隔(稱為作業周轉時間),它包括四部分時間:作業在外存后備隊列上等待(作業)調度的時間、進程在就緒隊列上等待進程調度的時間、進程在 CPU 上執行的時間、以及進程等待 I/O 操作完成的時間。

使用帶權周轉時間,能更清晰地描述各進程在其周轉時間中,等待和執行時間的具體分配狀況,即作業的周轉時間 T 與系統為它提供服務的時間 Ts 之比。

調度需要讓作業周轉時間和平均周轉時間盡可能短,這樣可以提高資源利用率並減少等待時間。

吞吐量

對於調度而言,吞吐量主要考量的是單位時間內完成了多少作業,調度需要追求較高的系統吞吐量。

等待和響應時間

等待時間是進程或作業處於等待 CPU 的狀態時間之和,對於進程等待時間是進程創建以后等待被服務的時間,對於作業等待時間在外存后背隊列中等待的時間加上調入內存后創建進程等待被服務的時間之和。
響應時間是用戶提交請求后,到首次產生響應所用的時間。無論是等待時間還是響應時間,都是越短越好。

調度的目標

  1. 運行效率高;
  2. 公平性:進程都獲得合理的 CPU 時間,不會發生進程飢餓現象;
  3. 平衡性:使系統中的 CPU 和各種外部設備都能經常處於忙碌狀態;
  4. 策略強制執行:對所制訂的策略要准確地執行。

作業調度

作業

在多道批處理系統中,作業是用戶提交給系統的一項相對獨立的工作。作業包含了程序、數據、作業說明書,系統根據該說明書來對程序的運行進行控制。用戶提交的作業通過輸入設備輸入到磁盤存儲器,並保存在一個后備作業隊列中,再由作業調度程序將其從外存調入內存。
在作業運行期間,每個作業都必須經過若干個加工步驟才能得到結果。每一個加工步驟稱為一個作業步,一個典型的作業可分成編譯、鏈接裝配和運行 3 個作業步。為了管理和調度作業,每個作業設置了一個作業控制塊 JCB,其中保存了系統對作業進行管理和調度所需的全部信息。

作業運行的階段

當一個作業進入系統時,由“作業注冊”程序為該作業建立一個作業控制塊 JCB,再根據作業類型將它放到相應的作業后備隊列中等待調度。調度程序依據一定的調度算法來調度,被調度到的作業將被裝入內存。在作業運行期間,系統就按照 JCB 中的信息和作業說明書對作業進行控制。當一個作業執行結束時,系統中的“終止作業”程序將會回收作業控制塊和所有資源,並將作業運行結果信息形成輸出文件后輸出作業撤銷該作業控制塊。作業從進入系統到運行結束,通常需要經歷以下三個階段,每種階段都對應一種狀態。

  1. 收容階段:用戶提交的作業輸入到硬盤上,為該作業建立 JCB 並放入作業后備隊列中,此時作業的狀態為“后備狀態”;
  2. 運行階段:當作業被作業調度選中后,分配必要的資源和建立進程並將它放入就緒隊列,此時作業的狀態為“運行狀態”;
  3. 完成階段:當作業運行完成、或發生異常情況而提前結束時,系統負責回收已分配的資源,此時作業的狀態為“完成狀態”。

作業調度的任務

作業調度的主要任務是根據 JCB 中的信息,檢查系統中的資源能否滿足作業對資源的需求,按照一定的調度算法從外存的后備隊列中選取某些作業調入內存。為它們創建進程、分配必要的資源,再將新創建的進程排在就緒隊列上等待調度。作業調度需要考慮允許多少個作業同時在內存中運行,以及應選擇后備隊列中的哪些作業調入內存 。

作業調度算法

先來先服務

先來先服務(first-come first-served,FCFS)調度算法是最簡單的調度算法,可用於作業調度和進程調度。作業調度時,系統將按照作業到達的先后次序來進行調度,從后備作業隊列中選擇幾個最先進入該隊列的作業,將它們調入內存並分配資源和創建進程,放入就緒隊列。進程調度時,每次調度是從就緒的進程隊列中選擇一個最先進入該隊列的進程,為之分配處理機運行。
FCFS 算法是從公平角度考慮的非搶占式算法,不會導致飢餓,雖然在單處理機系統中已很少作為主調度算法,但經常把它與其它調度算法相結合使用。

短作業優先

在實際情況中,短作業(進程)占有很大比例,而長進程的存在可能會導致大量短進程無法即使執行。短作業優先(short job first,SJF)的調度算法以作業的長短來計算優先級,作業運行時間越短其優先級越高,SJF 算法可以用於作業調度和進程調度。
SJF 調度算法對於 FCFS 算法有明顯的改進,但仍然存在一些缺點。SJF 算法必須預知作業的運行時間,但是往往很難准確估計作業的運行時間。SJF 算法會使長作業的周轉時間會明顯地增長,甚至可能出現飢餓現象。同時 SJF 算法完全未考慮作業的緊迫程度,不能保證緊迫性作業被及時處理。

優先級調度算法

優先級調度算法是基於作業的緊迫程度來考慮,可用於作業調度和進程調度。調度算法是根據外部賦予作業相應的優先級進行調度,這樣就可以保證緊迫性作業優先運行,但是這就要求對作業都預先分配好優先級。

高響應比優先調度算法

FCFS 算法只考慮了作業的等待時間,而忽視了作業的運行時間,SJF 算法只考慮作業的運行時間,而忽視了作業的等待時間。高響應比優先調度算法(Highest Response Ratio Next,HRRN)將作業的等待時間和運行時間綜合考慮,既讓短作業能盡快執行,又不致使長作業的等待時間過長。
高響應比優先算法引入一個動態優先級,優先級隨等待時間延長而增加,這將使長作業的優先級在等待期間不斷地增加。動態優先級的計算公式為:

進程調度

進程調度的任務

在進行調度時首先需要保存當前進程的處理機的現場信息,如程序計數器、多個通用寄存器中的內容等。然后調度程序按某種算法從就緒隊列中選取一個進程,將其狀態改為運行狀態,並准備把處理機分配給它。最后由分派程序把處理器分配給該進程,此時需要將選中進程的 PCB 內有關處理機現場的信息裝入處理器相應的各個寄存器中,把處理器的控制權交予該進程,讓它從上次的斷點處恢復運行。
狹義的進程調度指指就緒隊列中選擇一個要運行的程序,進程切換是一個進程讓出 CPU 讓另一個進程使用,廣義的進程調度包括了上述 2 個過程。

進程調度的機制

進程調度機制的示意圖如下,需要有排隊器、分配器和上下文切換器 3 個基本部分。

組件 說明
排隊器 當有一個進程轉變為就緒狀態時,排隊器將其插入到相應的就緒隊列
分派器 依據進程調度程序所選定的進程,將其從就緒隊列中取出
上下文切換器 把當前進程的 CPU 寄存器內容保存到該進程的 PCB,把新選進程的 CPU 現場信息裝入到 CPU 的寄存器中

進程調度的方式

非搶占方式

非搶占方式(Nonpreemptive Mode)是早期的調度方式,只允許進程主動放棄 CPU,也就是直至該進程完成或被阻塞時才把處理機分配給其它進程。這種調度方式的優點是實現簡單,系統開銷小,適用於大多數的批處理系統,但不能用於分時系統和大多數實時系統。

搶占方式

搶占方式(Preemptive Mode)允許調度程序根據某種原則暫停某個正在執行的進程,將已分配給該進程的 CPU 重新分配給另一進程。搶占方式最大的優點是可以防止一個長進程長時間地占用處理機,以確保處理機能為所有進程提供更為公平的服務。搶占必須遵循一定的原則,主要有:

  1. 優先權原則:允許優先級高的新到進程搶占當前進程的處理機;
  2. 短進程優先原則:允許新到的短進程可以搶占當前長進程的處理機;
  3. 時間片原則:當正在執行的進程的一個時間片用完后,便停止該進程的執行,重新進行調度。

進程調度算法

輪轉調度算法

基於時間片的輪轉(round robin,RR)調度算法是一種基本的調度算法,是一種搶占式的算法。系統將所有的就緒進程按 FCFS 策略排成一個就緒隊列,系統每隔一定時間就激活進程調度程序進行調度,把 CPU 分配給隊首進程並其執行一個時間片。
需要調度的時機有 2 種,第一種是在時間片尚未用完時進程已經完成運行,就立即激活調度程序將它從就緒隊列中刪除。第二種是在一個時間片用完時,計時器中斷處理程序被激活,調度程序將把它送往就緒隊列的末尾。由於當前進程已經進入隊尾,隊列頭的新進程將會被調度並執行一個時間片。每個進程每次僅運行一個時間片,如果就緒隊列上有 n 個進程,則每個進程每次大約都可獲得 1/n 的處理機時間。
時間片的大小對系統性能有很大的影響,若選擇很小的時間片,會導致頻繁地執行進程調度和進程上下文的切換。

若時間片選擇得太長,每個進程可能都能在一個時間片內完成,設置時間片就沒有意義了。

時間片大小最好是略大於一次典型的交互所需要的時間,使大多數交互式進程能在一個時間片內完成。

優先級調度算法

在時間片輪轉調度算法中,系統中所有進程的優先級是相同的,但是實際情況下進程的優先級不同。優先級進程調度算法是把處理機分配給就緒隊列中優先級最高的進程,搶占式的實現是把處理機分配給就緒隊列中優先級就不打斷。搶占式的實現是把處理機分配給優先級最高的進程后,執行期間若出現了另一個其優先級更高的進程,調度程序就將處理機分配給新到的優先級最高的進程。
優先級調度算法的參照就是優先級,它是用某一范圍內的一個整數來表示的,有靜態優先級和動態優先級 2 種。

優先級類型 說明
靜態優先級 創建進程時確定的,在進程的整個運行期間保持不變
動態優先級 在創建進程時先賦予一個優先級,值隨進程的推進或等待時間的增加而改變

確定進程優先級大小的依據有以下三個:

確定因素 說明
進程類型 通常系統進程高於一般用戶進程,前台進程高於后台進程
對資源的需求 對資源要求少的進程賦予較高的優先級
用戶要求 根據進程的緊迫程度及用戶的需求確定優先級

多隊列調度算法

前 2 種調度算法只設置了 1 個就緒隊列,這樣無法滿足系統中不同用戶對進程調度策略的不同要求。多隊列調度算法設置多個進程就緒隊列,可以將不同類型或性質的進程分配在不同的就緒隊列,不同的就緒隊列采用不同的調度算法。一個就緒隊列中的進程可以設置不同的優先級,不同的就緒隊列本身也可以設置不同的優先級,這樣就可以對不同的用戶進行更加合適的調度。

多級反饋隊列調度算法

多級反饋隊列調度算法(multileved feedback queue)不必事先知道各種進程所需的執行時間,還可以較好地滿足各種類型進程的需要,是目前公認的一種較好的進程調度算法。
多級反饋隊列調度算法設置多個就緒隊列,並為每個隊列賦予不同的優先級,第一個隊列的優先級最高,其余隊列的優先級逐個降低。不同隊列中的進程所賦予的執行時間片的大小也各不相同,在優先級愈高的隊列中其時間片就愈小。接着每個隊列都采用 FCFS 算法,當新進程進入內存后先將它放入第一等待隊列的末尾進行調度。如果該進程能在該時間片內完成便可撤離,否則調度程序將其轉入第二隊列的末尾等待調度。當進程最后被降到第 n 隊列后,在第 n 隊列中按 RR 調度算法運行。

調度程序首先調度最高優先級隊列中的諸進程運行僅當第 1~(i-1) 所有隊列均空時才會調度第 i 隊列中的進程運行。

基於公平原則的調度算法

上述幾種調度算法所保證的只是優先運行,但並不保證作業占用了多少處理機時間,沒有考慮到調度的公平性,因此又提出了 2 種相對公平的調度算法。保證調度算法保證處理機分配的公平性,如果在系統中有 n 個相同類型的進程同時運行,為公平起見須保證每個進程都獲得相同的 CPU 時間 1/n。
公平分享調度算法面向的是用戶,因為不同的用戶同時啟用的進程數量不同,所以該算法要保證所有用戶能獲得相同的 CPU 時間。

實時調度

實時系統的調度

在實時系統中存在 HRT 任務和 SRT 任務(硬實時任務和軟實時任務),這 2 類任務都有截止時間,實時調度必須能滿足實時任務對截止時間的要求。要實現實時調度,系統除了向調度程序提供就緒時間、處理時間、資源要求和優先級,也要提供開始截止時間和完成截止時間。
由於 HRT 和 SRT 任務的調度更為復雜,所以實時系統中對處理機的處理能力要求較高。假定系統中有 m 個周期性的硬實時任務 HRT,處理時間可表示為 Ci,周期時間表示為 Pi,則在單處理機情況下必須滿足下面的限制條件系統才是可調度的。實際情況下限制條件還需要留有任務切換的時間,因此如果采用單處理機系統就必須增強 CPU 處理能力,如果采用多處理機系統也不能超過 N 個 CPU 的處理能力。

因為 HRT 任務有截止時間的需求,因此往往實時調度是基於搶占式的機制來實現。為保證硬實時任務能及時運行,在系統中還應具有快速切換機制,對於中斷要能夠快速響應,並且能快速地進行任務切換。

實時調度算法

算法類型

實時調度可以分為搶占式和非搶占式調度算法,其中非搶占式調度算法主要有:

  1. 非搶占式輪轉調度算法:每一個被控對象建立一個實時任務,並將它們排成一個輪轉隊列進行調度;
  2. 非搶占式優先調度算法:為由較高要求的任務賦予較高的優先級,這些實時任務到達時安排在就緒隊列的隊首;

搶占式調度算法根據搶占發生時間的不同分成以下兩種:

  1. 基於時鍾中斷的搶占式優先級調度算法:如果某實時任務的優先級高於當前任務的優先級,等到時鍾中斷發生時調度程序才剝奪當前任務的執行;
  2. 立即搶占的優先級調度算法:一旦出現外部中斷,只要當前任務未處於臨界區就立即剝奪當前任務的執行,把處理機分配給請求中斷的緊迫任務;

最早截止時間優先算法

最早截止時間優先EDF(Earliest Deadline First)算法是根據任務的截止時間確定任務的優先級,任務的截止時間愈早優先級越高,具有最早截止時間的任務排在隊列的隊首。調度程序在選擇任務時選擇就緒隊列中的第一個任務,為之分配處理機。最早截止時間優先算法既可用於搶占式調度方式中,也可用於非搶占式調度方式中。

最低松弛度優先算法

最低松弛度優先LLF(Least Laxity First)算法根據的是任務的緊急(或松弛)程度確定優先級,任務緊急程度愈高優先級就愈高。例如有一個任務需要在 400ms 時必須完成,它需要運行 150ms,得到其松弛程度為 400 - 150 = 250ms。系統中需要一個按松弛度排序的實時任務就緒隊列,松弛度最低的任務排在最前面,調度程序選擇隊列中的隊首任務執行。

優先級倒置

在系統中由於多個進程對臨界資源的互斥,導致高優先級進程(或線程)被低優先級進程(或線程)延遲或阻塞的優先級倒置的現象。假如有三個完全獨立的進程 P1、P2 和 P3,優先級 P1 > P2 > P3,P1 和 P3 共享的一個臨界資源進行交互。假如 P3 最先執行並執行 P(mutex) 操作后進入臨界區,而 P2 此時就緒了,由於 P2 比 P3 的優先級高所以 P2 搶占了 P3 的處理機而運行。此時 P1 也就緒了,因為 P1 比 P2 的優先級高所以 P1 搶占了 P2 的處理機而運行。但是此時臨界資源已被 P3 占用,所以 P1 將被阻塞。
解決方法有 2 種,第一種是規定 P3 進入臨界區后 P3 所占用的處理機就不允許被搶占,但是如果 P3 臨界區非常長則高優先級進程 P1 仍會等待很長的時間。另一個方法是建立在動態優先級繼承,當高優先級進程要進入臨界區時,如果已有一個低優先級進程正在使用該資源,則由低優先級進程繼承高優先級進程的優先級,並一直保持到低優先級進程退出臨界區。

參考資料

《計算機操作系統(第四版)》,湯小丹 梁紅兵 哲鳳屏 湯子瀛 編著,西安電子科技大學出版社


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM