作業系統學習-10.處理機排程層次與佇列模型
寫在前面:
這一部分開始第三章處理機相關內容的學習。處理機是最重要的計算機資源,在多道程式環境下,主存中有著多個程序,其數目往往多於處理機數目。要求系統能按某種演算法,動態地把處理機分配給就緒佇列中的一個程序,使之執行。分配處理機的任務是由處理機排程程式完成的。
處理機排程的層次:
在多道程式系統中,一個作業被提交後必須經過處理機排程後,方能獲得處理機執行。對於批量型作業而言,通常需要經歷作業排程(又稱高階排程或長程排程)和程序排程(又稱低階排程或短程排程)兩個過程後方能獲得處理機。對於終端型作業,則通常只需經過程序排程即可獲得處理機。在較完善的作業系統中,為提高記憶體的利用率,往往還設定了中級排程(又稱中程排程)。
高階排程
高階排程(High Level Scheduling)又稱為作業排程或長程排程(LongTerm Scheduling),其主要功能是根據某種演算法,把外存上處於後備佇列中的那些作業調入記憶體,也就是說,它的排程物件是作業。作業在批處理系統中提及,批處理系統作業系統學習-1. 作業系統的目標和作用。
這裡對作業的概念作簡單的介紹。
- 作業(Job)。作業是一個比程式更為廣泛的概念,它不僅包含了通常的程式和資料,而且還應配有一份作業說明書,系統根據該說明書來對程式的執行進行控制。在批處理系統中,是以作業為基本單位從外存調入記憶體的。
- 作業步(Job Step)。通常,在作業執行期間,每個作業都必須經過若干個相對獨立,又相互關聯的順序加工步驟才能得到結果,我們把其中的每一個加工步驟稱為一個作業步,各作業步之間存在著相互聯絡,往往是把上一個作業步的輸出作為下一個作業步的輸入。一個典型的作業可分成三個作業步:① “編譯”作業步,通過執行編譯程式對源程式進行編譯,產生若干個目標程式段;② “連結裝配”作業步,將“編譯”作業步所產生的若干個目標程式段裝配成可執行的目標程式;③ “執行”作業步,將可執行的目標程式讀入記憶體並控制其執行。
- 作業流。若干個作業進入系統後,被依次存放在外存上,這便形成了輸入的作業流;在作業系統的控制下,逐個作業進行處理,於是便形成了處理作業流
除此之外與作業相關內容還有作業控制塊 JCB(Job Control Block)、作業排程。
- 作業控制塊 JCB(Job Control Block):為了管理和排程作業,在多道批處理系統中為每個作業設定了一個作業控制塊,如同程序控制塊是程序在系統中存在的標誌一樣,它是作業在系統中存在的標誌,其中儲存了系統對作業進行管理和排程所需的全部資訊。
- 作業排程:作業排程的主要功能是根據作業控制塊中的資訊,審查系統能否滿足使用者作業的資源需求,以及按照一定的演算法,從外存的後備佇列中選取某些作業調入記憶體,併為它們建立程序、分配必要的資源。然後再將新建立的程序插入就緒佇列,準備執行。因此,有時也把作業排程稱為接納排程(Admission Scheduling)。
低階排程
低階排程 (Low Level Scheduling) 稱為 程序排程或短程排程 (ShortTermScheduling),它所排程的物件是程序(或核心級執行緒)。程序排程是最基本的一種排程,在多道批處理、分時和實時三種類型的 OS 中,都必須配置這級排程。
1.低階排程的功能
低階排程用於決定就緒佇列中的哪個程序(或核心級執行緒,為敘述方便,以後只寫程序)應獲得處理機,然後再由分派程式執行把處理機分配給該程序的具體操作。
低階排程的主要功能如下:
- 儲存處理機的現場資訊。在程序排程進行排程時,首先需要儲存當前程序的處理機的現場資訊,如程式計數器、多個通用暫存器中的內容等,將它們送入該程序的程序控制塊(PCB)中的相應單元。
- 按某種演算法選取程序。低階排程程式按某種演算法如優先數演算法、輪轉法等,從就緒佇列中選取一個程序,把它的狀態改為執行狀態,並準備把處理機分配給它。
- 把處理器分配給程序。由分派程式(Dispatcher)把處理器分配給程序。此時需為選中的程序恢復處理機現場,即把選中程序的程序控制塊內有關處理機現場的資訊裝入處理器相應的各個暫存器中,把處理器的控制權交給該程序,讓它從取出的斷點處開始繼續執行。
2.程序排程中的三個基本機制
- 排隊器。為了提高程序排程的效率,應事先將系統中所有的就緒程序按照一定的方式排成一個或多個佇列,以便排程程式能最快地找到它。
- 分派器(分派程式)。分派器把由程序排程程式所選定的程序,從就緒佇列中取出該程序,然後進行上下文切換,將處理機分配給它。
- 上下文切換機制。當對處理機進行切換時,會發生兩對上下文切換操作。在第一對上下文切換時,作業系統將儲存當前程序的上下文,而裝入分派程式的上下文,以便分派程式執行;在第二對上下文切換時,將移出分派程式,而把新選程序的 CPU 現場資訊裝入到處理機的各個相應暫存器中。
3.程序排程方式
(1)非搶佔方式(Nonpreemptive Mode)。
在採用這種排程方式時,一旦把處理機分配給某程序後,不管它要執行多長時間,都一直讓它執行下去,決不會因為時鐘中斷等原因而搶佔正在執行程序的處理機,也不允許其它程序搶佔已經分配給它的處理機。直至該程序完成,自願釋放處理機,或發生某事件而被阻時,才再把處理機分配給其他程序。
在採用非搶佔排程方式時,可能引起程序排程的因素可歸結為如下幾個:
- 正在執行的程序執行完畢,或因發生某事件而不能再繼續執行;
- 執行中的程序因提出 I/O 請求而暫停執行;
- 在程序通訊或同步過程中執行了某種原語操作,如 P 操作(wait 操作)、Block 原語、Wakeup 原語等。
這種排程方式的優點是實現簡單,系統開銷小,適用於大多數的批處理系統環境。但它難以滿足緊急任務的要求——立即執行,因而可能造成難以預料的後果。顯然,在要求比較嚴格的實時系統中,不宜採用這種排程方式。
(2)搶佔方式(Preemptive Mode)。
這種排程方式允許排程程式根據某種原則去暫停某個正在執行的程序,將已分配給該程序的處理機重新分配給另一程序。搶佔方式的優點是,可以防止一個長程序長時間佔用處理機,能為大多數程序提供更公平的服務,特別是能滿足對響應時間有著較嚴格要求的實時任務的需求。但搶佔方式比非搶佔方式排程所需付出的開銷較大。
搶佔排程方式是基於一定原則的,主要有如下幾條:
- 優先權原則。通常是對一些重要的和緊急的作業賦予較高的優先權。當這種作業到達時,如果其優先權比正在執行程序的優先權高,便停止正在執行(當前)的程序,將處理機分配給優先權高的新到的程序,使之執行;或者說,允許優先權高的新到程序搶佔當前程序的處理機。
- 短作業(程序)優先原則。當新到達的作業(程序)比正在執行的作業(程序)明顯的短時,將暫停當前長作業(程序)的執行,將處理機分配給新到的短作業(程序),使之優先執行;或者說,短作業(程序)可以搶佔當前較長作業(程序)的處理機。
- 時間片原則。各程序按時間片輪流執行,當一個時間片用完後,便停止該程序的執行而重新進行排程。這種原則適用於分時系統、大多數的實時系統,以及要求較高的批處理系統
中級排程
中級排程(Intermediate Level Scheduling)又稱中程排程(Medium-Term Scheduling)。引入中級排程的主要目的是為了提高記憶體利用率和系統吞吐量。為此,應使那些暫時不能執行的程序不再佔用寶貴的記憶體資源,而將它們調至外存上去等待,把此時的程序狀態稱為就緒駐外存狀態或掛起狀態。當這些程序重又具備執行條件且記憶體又稍有空閒時,由中級排程來決定把外存上的那些又具備執行條件的就緒程序重新調入記憶體,並修改其狀態為就緒狀態,掛在就緒佇列上等待程序排程。
中級排程實際上就是儲存器管理中的對換功能,我們將在儲存器管理中做詳細闡述。
根據後面的學習,接觸到了中級排程,中級排程其實就是程序對換操作,程序對換就是將記憶體中暫時不能執行的程序或者暫時不用的程式和資料調到外存上,以便整理出足夠的記憶體空間供給已具備執行條件的程序或程序說需要的程序和資料調入記憶體。更多詳細資訊可參考:作業系統學習-18. 可重定位分割槽分配與對換。
三種排程方法小結
程序排程的執行頻率最高,在分時系統中通常是 10~100 ms 便進行一次程序排程,因此把它稱為短程排程。為避免程序排程佔用太多的 CPU 時間,程序排程演算法不宜太複雜。
作業排程往往是發生在一個(批)作業執行完畢,退出系統,而需要重新調入一個(批)作業進入記憶體時,故作業排程的週期較長,大約幾分鐘一次,因此把它稱為長程排程。
由於其執行頻率較低,故允許作業排程演算法花費較多的時間。中級排程的執行頻率基本上介於上述兩種排程之間,因此把它稱為中程排程。
僅有程序排程的排程佇列模型
在分時系統中,通常僅設定了程序排程,使用者鍵入的命令和資料都直接送入記憶體。對於命令,是由 OS 為之建立一個程序。系統可以把處於就緒狀態的程序組織成棧、樹或一個無序連結串列,至於到底採用其中哪種形式,則與 OS 型別和所採用的排程演算法有關。例如,在分時系統中,常把就緒程序組織成 FIFO 佇列形式。每當 OS 建立一個新程序時,便將它掛在就緒佇列的末尾,然後按時間片輪轉方式執行。
每個程序在執行時都可能出現以下三種情況:
- 任務在給定的時間片內已經完成,該程序便在釋放處理機後進入完成狀態;
- 任務在本次分得的時間片內尚未完成,OS 便將該任務再放入就緒佇列的末尾;
- 在執行期間,程序因為某事件而被阻塞後,被 OS 放入阻塞佇列。
圖1. 僅具有程序排程的排程佇列模型
具有高階和低階排程的排程佇列模型
在批處理系統中,不僅需要程序排程,而且還需有作業排程,由後者按一定的作業排程演算法,從外存的後備佇列中選擇一批作業調入記憶體,併為它們建立程序,送入就緒佇列,然後才由程序排程按照一定的程序排程演算法選擇一個程序,把處理機分配給該程序。
該模型與上一模型的主要區別在於如下兩個方面。
- 就緒佇列的形式。在批處理系統中,最常用的是最高優先權優先排程演算法,相應地,最常用的就緒佇列形式是優先權佇列。程序在進入優先順序佇列時,根據其優先權的高低,被插入具有相應優先權的位置上,這樣,排程程式總是把處理機分配給就緒佇列中的隊首程序。在最高優先權優先的排程演算法中,也可採用無序連結串列方式,即每次把新到的程序掛在鏈尾,而排程程式每次排程時,是依次比較該鏈中各程序的優先權,從中找出優先權最高的程序,將之從鏈中摘下,並把處理機分配給它。
- 設定多個阻塞佇列。對於小型系統,可以只設置一個阻塞佇列;但當系統較大時,若仍只有一個阻塞佇列,其長度必然會很長,佇列中的程序數可以達到數百個,這將嚴重影響對阻塞佇列操作的效率。故在大、中型系統中通常都設定了若干個阻塞佇列,每個佇列對應於某一種程序阻塞事件。
圖2. 具有高、低兩級排程的排程佇列模型
同時具有三級排程的排程佇列模型
當在 OS 中引入中級排程後,人們可把程序的就緒狀態分為記憶體就緒(表示程序在記憶體中就緒)和外存就緒(程序在外存中就緒)。類似地,也可把阻塞狀態進一步分成記憶體阻塞和外存阻塞兩種狀態。在調出操作的作用下,可使程序狀態由記憶體就緒轉為外存就緒,由記憶體阻塞轉為外存阻塞;在中級排程的作用下,又可使外存就緒轉為記憶體就緒。
圖3. 具有三級排程時的排程佇列模型