猿考研之作業系統篇二(處理機排程)

tony0087發表於2021-09-09

處理機排程

當有一堆任務要處理,但由於資源有限,這些事情沒法同時處理。這就需要確定某種規則來決定處理這些任務的順序,這就是“排程”研究的問題。
在多道程式系統中,程式的數量往往是多於處理機的個數的,這樣不可能同時並行地處理各個程式。處理機排程,就是從就緒佇列中按照一定的演算法選擇一個程式並將處理機分配給它執行,以實現程式的併發執行。*

圖片描述

排程層次

  • 由於記憶體空間有限,有時無法將使用者提交的作業全部放入記憶體,因此就需要確定某種規則來決定將作業調入記憶體的順序。

  • 高階排程(作業排程)

    • 按一定的原則從外存上處於後備佇列的作業中挑選一個(或多個)作業,給他們分配記憶體等必要資源,並建立相應的程式(建立PCB),以使它(們)獲得競爭處理機的權利
    • 高階排程是輔存(外存)與記憶體之間的排程。每個作業只調入一次,調出一次。作業調入時會建立相應的PCB,作業調出時才撤銷PCB。高階排程主要是指調入的問題,因為只有調入的時機需要作業系統來確定,但調出的時機必然是作業執行結束才調出。
  • 中級排程(記憶體排程)

    • 引入了虛擬儲存技術之後,可將暫時不能執行的程式調至外存等待。等它重新具備了執行條件且記憶體又稍有空閒時,再重新調入記憶體。
    • 這麼做的目的是為了提高記憶體利用率系統吞吐量
    • 暫時調到外存等待的程式狀態為掛起狀態。值得注意的是,PCB並不會一起調到外存,而是會常駐記憶體。PCB中會記錄程式資料在外存中的存放位置,程式狀態等資訊,作業系統透過記憶體中的PCB來保持對各個程式的監控、管理。被掛起的程式PCB會被放到的掛起佇列中。
    • 中級排程(記憶體排程),就是要決定將哪個處於掛起狀態的程式重新調入記憶體。
    • 一個程式可能會被多次調出、調入記憶體,因此中級排程發生的頻率要比高階排程更高
  • 低階排程(程式排程)

    • 其主要任務是按照某種方法和策略從就緒佇列中選取一個程式,將處理機分配給它。
    • 程式排程是作業系統中最基本的一種排程,在一般的作業系統中都必須配置程式排程。程式排程的頻率很高,一般幾十毫秒一次。

圖片描述

  • 七狀態模型
  • 暫時調到外存等待的程式狀態為掛起狀態(掛起態,suspend)
  • 掛起態又可以進一步細分為就緒掛起、阻塞掛起兩種狀態
  • 注意“掛起”和“阻塞”的區別,兩種狀態都是暫時不能獲得CPU的服務,但掛起態是將程式映像調到外存去了,而阻塞態下程式映像還在記憶體中
  • 有的作業系統會把就緒掛起、阻塞掛起分為兩個掛起佇列,甚至會根據阻塞原因不同再把阻塞掛起程式進一步細分為多個佇列。

圖片描述

程式排程的時機

圖片描述

程式排程(低階排程),就是按照某種演算法從就緒佇列中選擇一個程式為其分配處理機。
圖片描述

  • 不能進行程式排程與切換的情況
    • 處理中斷的過程中。中斷處理過程複雜,與硬體密切相關,很難做到在中斷處理過程中進行程式切換。
  • 程式在作業系統核心程式臨界區中。
    • 但是程式在普通臨界區中是可以進行排程,切換的。
    • 臨界資源:一個時間段內只允許一個程式使用的資源。各程式需要互斥地訪問臨界資源。
    • 臨界區:訪問臨界資源的那段程式碼
    • 核心程式臨界區一般是用來訪問某種核心資料結構的,比如程式的就緒佇列(由各就緒程式的PCB組成)
    • 如果還沒退出臨界區(就緒佇列還沒解鎖)就進行程式排程,但是程式排程相關的程式也需要訪問就緒佇列,但此時就緒佇列被鎖住了,因此沒法正確執行
    • 核心程式臨界區訪問的臨界資源如果不盡快釋放的話,極有可能影響到作業系統核心的其他管理工作。因此在訪問核心程式臨界區期間不能進行排程與切換
    • 在印表機列印完成之前,程式一直處於臨界區內,臨界資源不會解鎖。但印表機又是慢速裝置,此時如果一直不允許程式排程的話就會導致CPU一直空閒。所以,普通臨界區訪問的臨界資源不會直接影響作業系統核心的管理工作。因此在訪問普通臨界區時可以進行排程與切換
  • 原子操作過程中(原語)。原子操作不可中斷,要一氣呵成(如之前講過的修改PCB中程式狀態標誌,並把PCB放到相應佇列)

程式排程的方式

有的系統中,只允許程式主動放棄處理機。有的系統中,程式可以主動放棄處理機,當有更緊急的任務需要處理時,也會強行剝奪處理機(被動放棄)

  • 非剝奪排程方式,又稱非搶佔方式。即,只允許程式主動放棄處理機。在執行過程中即便有更緊迫的任務到達,當前程式依然會繼續使用處理機,直到該程式終止或主動要求進入阻塞態。
    • 實現簡單,系統開銷小但是無法及時處理緊急任務,適合於早期的批處理系統
  • 剝奪排程方式,又稱搶佔方式。當一個程式正在處理機上執行時,如果有一個更重要或更緊迫的程式需要使用處理機,則立即暫停正在執行的程式,將處理機分配給更重要緊迫的那個程式。
    • 可以優先處理更緊急的程式,也可實現讓各程式按時間片輪流執行的功能(透過時鐘中斷)。適合於分時作業系統、實時作業系統

程式排程的切換與過程

  • “狹義的程式排程”與“程式切換”的區別:

    • 狹義的程式排程指的是從就緒佇列中選中一個要執行的程式。(這個程式可以是剛剛被暫停執行的程式,也可能是另一個程式,後一種情況就需要程式切換
  • 程式切換是指一個程式讓出處理機,由另一個程式佔用處理機的過程。

  • 廣義的程式排程包含了選擇一個程式和程式切換兩個步驟。

  • 程式切換的過程主要完成了:

    • 1.對原來執行程式各種資料的儲存
    • 2.對新的程式各種資料的恢復
    • (如:程式計數器、程式狀態字、各種資料暫存器等處理機現場資訊,這些資訊一般儲存在程式控制塊)
  • 注意:程式切換是有代價的,因此如果過於頻繁的進行程式排程、切換,必然會使整個系統的效率降低,使系統大部分時間都花在了程式切換上,而真正用於執行程式的時間減少。

排程演算法的好壞

圖片描述

CPU利用率

CPU利用率:指CPU“忙碌”的時間佔總時間的比例。
圖片描述

系統吞吐量

系統吞吐量:單位時間內完成作業的數量
圖片描述

週轉時間、平均週轉時間

  • 對於計算機的使用者來說,他很關心自己的作業從提交到完成花了多少時間。
  • 週轉時間,是指從作業被提交給系統開始,到作業完成為止的這段時間間隔。
  • 它包括四個部分:作業在外存後備佇列上等待作業排程(高階排程)的時間、程式在就緒佇列上等待程式排程(低階排程)的時間、程式在CPU上執行的時間、程式等待I/O操作完成的時間。後三項在一個作業的整個處理過程中,可能發生多次。
    圖片描述
  • 有的作業執行時間短,有的作業執行時間長,因此在週轉時間相同的情況下,執行時間不同的作業,給使用者的感覺肯定是不一樣的,所以有了帶權週轉時間

圖片描述

  • 對於週轉時間相同的兩個作業,實際執行時間長的作業在相同時間內被服務的時間更多,帶權週轉時間更小,使用者滿意度更高。
  • 對於實際執行時間相同的兩個作業,週轉時間短的帶權週轉時間更小,使用者滿意度更高。

等待時間

  • 計算機的使用者希望自己的作業儘可能少的等待處理機
  • 等待時間,指程式/作業處於等待處理機狀態時間之和,等待時間越長,使用者滿意度越低。
    圖片描述
  • 對於程式來說,等待時間就是指程式建立後等待被服務的時間之和,在等待/0完成的期間其實程式也是在被服務的,所以不計入等待時間。
  • 對於作業來說,不僅要考慮建立程式後的等待時間,還要加上作業在外存後備佇列中等待的時間
  • 一個作業總共需要被CPU服務多久,被/0裝置服務多久一般是確定不變的,因此排程演算法其實只會影響作業/程式的等待時間。當然,與前面指標類似,也有“平均等待時間”來評價整體效能。

響應時間

  • 對於計算機使用者來說,會希望自己的提交的請求(比如透過鍵盤輸入了一個除錯命令)儘早地開始被系統服務、回應。
  • 響應時間,指從使用者提交請求到首次產生響應所用的時間

排程演算法

先來先服務(FCFS,First come first serve)

圖片描述

圖片描述

短作業優先(SJF,SPF,Shorttest Job First)

圖片描述
圖片描述
圖片描述

  • 所有程式同時可執行時,採用SF排程演算法的平均等待時間、平均週轉時間最少
  • 也可以說,在所有程式都幾乎同時到達時,採用SF排程演算法的平均等待時間、平均週轉時間最少
  • 同義,搶佔式的短作業/程式優先排程演算法(最短剩餘時間優先,SRNT演算法)的平均等待時間、平均週轉時間最少

對比FCFS和SJF

  • FCFS演算法是在每次排程的時候選擇一個等待時間最長的作業(程式)為其服務。但是沒有考慮到作業的執行時間,因此導致了對短作業不友好的問題
  • SJF演算法是選擇一個執行時間最短的作業為其服務。但是又完全不考慮各個作業的等待時間,因此導致了對長作業不友好的問題,甚至還會造成飢餓問題
  • 所以,怎麼兼顧執行時間考慮各個作業的等待時間呢?

高響應比優先 (HRRN)

圖片描述
圖片描述

比較

注:這幾種演算法主要關心對使用者的公平性、平均週轉時間、平均等待時間等評價系統整體效能的指標,但是不關心“響應時間”,也並不區分任務的緊急程度,因此對於使用者來說,互動性很糟糕。因此這三種演算法一般適合用於早期的批處理系統,當然,FCFS演算法也常結合其他的演算法使用,在現在也扮演著很重要的角色。
圖片描述

時間片輪轉排程(RR,Round-Robin)

常用於分時作業系統,更注重“響應時間“”,因而此處不計算週轉時間
圖片描述
圖片描述
圖片描述

  • 如果時間片太大,使得每個程式都可以在一個時間片內就完成,則時間片輪轉排程演算法退化為先來先服務排程演算法,並且會增大程式響應時間。因此時間片不能太大
    • 比如:系統中有10個程式在併發執行,如果時間片為1秒,則一個程式被響應可能需要等9秒.…也就是說,如果使用者在自己程式的時間片外透過鍵盤發出除錯命令,可能需要等待9秒才能被系統響應
  • 另一方面,程式排程、切換是有時間代價的(儲存、恢復執行環境),因此如果時間片太小,會導致程式切換過於頻繁,系統會花大量的時間來處理程式切換,從而導致實際用於程式執行的時間比例減少。可見時間片也不能太小
  • 一般來說,設計時間片時要讓切換程式的開銷佔比不超過1%

優先順序排程演算法

圖片描述
圖片描述
圖片描述

  • 就緒佇列未必只有一個,可以按照不同優先順序來組織。另外,也可以把優先順序高的程式排在更靠近隊頭的位置
  • 根據優先順序是否可以動態改變,可將優先順序分為靜態優先順序動態優先順序兩種。
    • 靜態優先順序:建立程式時確定,之後一直不變。
    • 動態優先順序:建立程式時有一個初始值,之後會根據情況動態地調整優先順序。
  • 合理設定優先順序的準則
    • 系統程式優先順序高於使用者程式
    • 前臺程式優先順序高於後臺程式
    • 作業系統更偏好I/O型程式(或稱l/O繁忙型程式)
    • 與I/O型程式相對的是計算型程式(或稱CPU繁忙型程式)
    • I/O裝置和CPU可以並行工作。如果優先讓I/O繁忙型程式優先執行的話,則越有可能讓I/O裝置儘早地投入工作,則資源利用率、系統吞吐量都會得到提升
  • 動態優先順序根據什麼調整
    • 可以從追求公平、提升資源利用率等角度考慮
    • 如果某程式在就緒佇列中等待了很長時間,則可以適當提升其優先順序
    • 如果某程式佔用處理機執行了很長時間,則可適當降低其優先順序
    • 如果發現一個程式頻繁地進行I/O操作,則可適當提升其優先順序

多級反饋佇列排程演算法

  • 綜合所有的優點
    • FCFS演算法的優點是公平
    • SJF演算法的優點是能儘快處理完短作業,平均等待/週轉時間等引數很優秀
    • 時間片輪轉排程演算法可以讓各個程式得到及時的響應
    • 優先順序排程演算法可以靈活地調整各種程式被服務的機會
      圖片描述
      圖片描述
  • 被搶佔處理機的程式重新放回原佇列隊尾

對比

圖片描述
注:比起早期的批處理作業系統來說,由於計算機造價大幅降低,因此之後出現的互動式作業系統(包括分時作業系統、實時作業系統等)更注重系統的響應時間、公平性、平衡性等指標。而這幾種演算法恰好也能較好地滿足互動式系統的需求。因此這三種演算法適合用於互動式系統。(比如UNIX使用的就是多級反饋佇列排程演算法)

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/1747/viewspace-2820911/,如需轉載,請註明出處,否則將追究法律責任。

相關文章