《操作系統概念》筆記--第五章 進程調度

基本概念

CPU調度是多道程序操作系統的基礎。通過在進程間切換CPU,操作系統可以使得計算機更加高效。
對於單處理器系統,同一時間只有一個進程可以運行,其他進程都應等待,直到CPU空閒並可調度爲止。
多道程序的目標就是,始終允許某個進程運行以最大化CPU利用率。

一個進程執行直到它應等待爲止,通常等待某個I/O請求的完成。對於簡單的計算機系統,CPU就處於閒置狀態。所有這些等待時間就會浪費,沒有完成任何有用的工作。
採用多道程序,試圖有效利用這些時間。多個進程同時處於內存中,當一個進程等待時,操作系統就從該進程接管CPU控制,並將CPU交給另一個進程。這種方式不斷重複。當一個進程必須等待時,另一進程接管CPU使用權。

幾乎所有的計算機資源在使用前都要調度,最重要的是CPU調度。

CPU-I/O執行週期

進程執行包括週期(cycle)進行CPU執行和I/O等待。

進程在這兩個狀態之間不斷交替。

進程執行的過程:進程執行從CPU執行(CPU burst)開始,之後I/O執行(I/O burst),接着另一個CPU執行,另一個I/O執行,等等。
最後CPU執行通過系統請求結束,以便終止執行。

CPU調度程序

每當CPU空閒時,操作系統就應從就緒隊列中選擇一個進程來執行。
進程採用短期調度程序和CPU調度程序。
就緒隊列中的記錄通常爲進程控制快(Procss control block, PCB)

搶佔調度

需要進行CPU調度的情況分爲以下種:

  1. 當一個進程從運行狀態切換到等待狀態(如I/O請求,wait()調用)
  2. 當一個進程從運行狀態切換到就緒狀態(如 當出現中斷時)
  3. 當一個進程從等待狀態切換到就緒狀態(如 I/O完成)
  4. 當一個進程終止時

對於1,4種情況,除了調度沒有選擇,一個新進程必須被執行。

如果調度只能發生在第1種與第4種情況下,則調度方案稱爲非搶佔的(nonpreemptive)協作的(cooperative),否則,調度方案爲搶佔的(preemptive)

在非搶佔調度下,一旦某個進程分配到CPU,該進程會一直使用CPU,直到它終止或切換到等待狀態。

調度程序

調度程序(dispatcher):調度程序是一個模塊,用來將CPU控制交給短期調度程序選擇的進程。
有下面
三個
功能:

  1. 切換上下文
  2. 切換到用戶模式
  3. 切換到用戶程序的合適位置,以便重新啓動程序。

**調度延遲(dispatch latency):**調度程序停止一個進程而啓動另一個所需的時間稱爲調度延遲。

所以調度程序應儘可能快,因爲在每次進程切換時都要使用

調度準則

爲了比較CPU調度算法,可以採用許多比較準則。
有以下五種準則:

  1. **CPU使用率:**應使CPU儘可能忙碌。

對於一個實際系統,它的範圍應從40%到90%

  1. **吞吐量(throughput):**是一個時間單元內進程完成的數量。

對於長進程,吞吐量可能爲每小時一個進程,對於短進程,吞吐量可能爲每秒十個進程。

  1. **週轉時間(turnaround time):**從進程提交到進程完成的時間段稱爲週轉時間。週轉時間爲所有時間段之和,包括等待進入內存,在就緒隊列中等待,在CPU上執行和I/O執行。
  2. **等待時間:**在就緒隊列中等待所花時間之和。

CPU調度算法並不影響進程運行和執行I/O等待時間,它隻影響進程在就緒隊列中因等待所需的時間。

  1. **響應時間:**從提交請求到產生第一響應的時間。

對於交互系統,響應時間更加重要

一般來說,最大化CPU使用率和吞吐率,並且最小化週轉時間,等待時間和響應時間。大多數情況下,優化的是平均值,但是,有些情況需要優化最大值和最小值等。比如交互系統爲了保證所有用戶都能得到好的服務,可能要使最大響應時間最小。

調度算法

CPU調度處理的問題是,從就緒隊列中選擇進程以便爲其分配CPU。

注意是從就緒隊列

先到先服務調度

先到先服務調度算法(First-Come First-Served,FCFS):先請求CPU的進程首先分配到CPU。

最簡單的CPU調度算法就是先到先服務調度算法

FCFS策略可以通過FIFO隊列實現。
當一個進程進入就緒隊列中,它的PCB會被鏈接到隊列尾部。
當CPU空閒時,它會分配給位於隊列頭部的進程,並且這個運行進程從隊列中移去。
缺點是平均等待時間往往很長。
假設有下面一組進程:
圖
如果進程按P1,P2,P3的順序到達,得到如下圖
圖
平均等待時間爲(0+24+27)/3=17ms
但如果按照P2,P3,P1的順序到達,有如下圖
圖
平均等待時間爲(6+0+3)/3=3ms
可以看出兩種情況的平均等待時間相差很大,這是因爲護航效果的影響。
**護航效果(convoy effect):**所有其他進程都等待一個大進程釋放CPU。

與讓較短進程先進行相比,這會導致CPU和設備的使用率降低。

最短作業優先調度

**最短作業優先調度算法(Shortest-Job-First, SJF):**這個算法將每個進程與其下次執行的長度關聯起來。當CPU變爲空閒時,它會被賦給具有最短CPU執行的進程。

調度取決於下次CPU執行的長度,而不是其總長度

假設有以下一組進程:
圖
則調度順序圖爲:
圖
平均等待時間爲(3+16+9+0)/4=7ms
SJF調度算法是最優的,因爲它的平均等待時間最小。
但是SJF算法的真正困難是如何知道下次CPU執行的長度。這也導致了SJF調度經常用於長期調度,而不能在短期CPU調度級別上實現

因爲沒有辦法知道下次CPU執行的長度

一種辦法就是試圖近似SJF調度,如下次CPU執行通常預測爲以前CPU執行的測量長度的指數平均(exponential average)
SJF調度可以是搶佔的,也可以是非搶佔的,搶佔的SJF調度也被稱爲最短剩餘時間優先(shortest-remaining-time-first)調度。聽名字就很容易理解了。
假設有下面4個進程
圖
那麼搶佔SJF調度執行圖爲:
圖
平均等待時間[(10-1)+(1-1)+(17-2)+(5-3)]/4=6.5ms

進程P1在時間0開始,因爲這時候只有進程P1。進程P2在時間1到達。進程P1剩餘時間大於進程P2需要的時間,因此進程P1被搶佔,而進程P2被調度。

優先級調度

**優先級調度(priority-scheduling):**每個進程都有一個優先級與其關聯,而具有最高優先級的進程會分配到CPU。

SJF算法是一個簡單的優先級算法,其優先級爲下次預測的CPU執行的倒數。CPU執行時間越長,則優先級越小。

假設有以下一組進程:
圖
採用優先級調度,按如下順序進行:
圖
平均等待時間爲8.2ms
優先調度可以是搶佔的或非搶佔的。當一個進程到達就緒隊列時,比較它的優先級與當前運行進程的優先級。
無窮阻塞(indefinite blocking)飢餓(starvation):這是優先級調度算法的一個主要問題。有時候優先級調度算法會讓某個低優先級進程無窮等待CPU。對於一個超載計算機系統,穩定的更高優先級進程流可以阻止低優先級的進程獲得CPU。要麼進程最終會運行,要麼系統最終崩潰並失去所有未完成的低優先級進程。
就緒運行但是等待CPU的進程可以認爲是阻塞的
解決方案-老化(aging):逐漸增加在系統中等待很長時間的進程的優先級。

例如,如果優先級從127(低)到0(高),那麼每15分鐘遞減等待進程的優先級的值。最終初始優先級值爲127的進程會有系統內最高的優先級,進而能夠執行。事實上,不會超過32小時,優先級爲127的進程會老化爲優先級爲0的進程。

輪轉調度

**輪轉調度算法(Round-Robin, RR):**類似於FCFS調度,但是增加了搶佔以切換進程。就緒隊列作爲循環隊列,CPU調度程序循環整個就緒隊列,爲每個進程分配不超過一個時間片的CPU。
**時間量(tim quantum)或時間片(time slice)😗*一個較小時間單元,大小通常爲10~100ms。
RR調度流程:

  1. CPU調度程序從就緒隊列中選擇第一個進程,將定時器設置在一個時間片後中斷,最後分派這個進程。
  2. 如果進程只需少於時間片的CPU執行,進程本身會自動釋放CPU,調度程序接着處理就緒隊列的下一個進程。
  3. 否則,如果當前運行進程的CPU執行大於一個時間片,那麼定時器會中斷,進而中斷操作系統。然後,進行上下文切換,再將進程加到就緒隊列的尾部,接着CPU調度程序會選擇就緒隊列內的下一個進程。

RR策略的平均等待時間一般較長。假設有以下一組進程:
圖
執行過程如下:
圖
平均等待時間[(10-4) + (4) + (7)]/3=5.66ms

如果就緒隊列有n個進程,並且時間片爲q,那麼每個進程會得到1/n的CPU時間。而且每次分得的時間不超過q個時間單元。每個進程等待獲得下一個CPU時間片的時間不會超過(n-1)q個時間單元
RR算法的性能很大程度上取決於時間片的大小。大多數現代操作系統的時間片爲10~100ms,上下文切換的時間一般少於10ms,因此,上下文切換的時間僅佔時間片的一小部分。

多級隊列調度

**多級隊列調度算法(multilevel queue):**將就緒隊列分成多個單獨隊列。根據進程屬性,如內存大小,進程優先級,進程類型等,一個進程永久分到一個隊列。每個隊列有自己的調度算法。隊列之間也有調度,通常採用固定優先級搶佔調度。

如可有兩個隊列分別用於前臺進程和後臺進程。前臺隊列可以採用RR算法調度,而後臺隊列可以採用FCFS調度算法

前臺進程(foreground process)和後臺進程(background process)
進程通常分爲前臺進程和後臺進程。這兩種類型的進程具有不同的響應時間要求,進而也有不同調度需要。與後臺進程相比,前臺進程具有更高的優先級。
下面是一個多級隊列調度算法的實例,假設有以下五個隊列:(他們的優先級由高到低)

  • 系統進程
  • 交互進程
  • 交互編輯進程
  • 批處理進程
  • 學生進程

每個隊列與更低隊列相比具有絕對的優先
只有系統進程,交互進程和交互編輯進程隊列都爲空,批處理隊列內的進程纔可運行。
如果在一個批處理進程運行時有一個交互進程進入就緒隊列,那麼該批處理進程會被搶佔。

還有一種可能,在隊列之間劃分時間片
每個隊列都有一定比例的CPU時間,可用於調度隊列內的進程。
對於前臺-後臺隊列的例子,前臺隊列可以有80%的CPU時間,用於在進程之間進行RR調度,而後臺隊列可以有20%的CPU時間,用於按FCFS算法來調度進程。

線程調度

競爭範圍

進程競爭範圍(System-Contention Scopee, PCS):對於實現多對一和多對多模型的系統線程庫會調度用戶級線程,以便在LWP(輕量級進程)上運行。

因爲競爭CPU是發生在同一進程的線程之間(當我們說線程庫將用戶線程調度到可用LWP時候,並不意味着線程真實運行在一個CPU上。這會需要操作系統調度內核線程到物理CPU)

系統競爭範圍(System-Contention Scope, SCS):爲了決定哪個內核級線程調度到一個處理器上,內核採用SCS來競爭CPU,發生在系統內的所有線程之間。

多處理器調度

多處理器調度的方法

非對稱多處理器(asymmetric multiprocessing):讓一個處理器處理所有調度決定,I/O處理以及其他系統活動,其他的處理器只執行用戶代碼。

因爲只有一個處理器訪問系統數據結構,減少了數據共享的需要。

對稱多處理器(Symmetric MultiProcessing, SMP):即每個處理器自我調度。所有進程可能處於一個共同的就緒隊列中,或每個處理器都有它自己的私有就緒進程隊列。

處理器親和性

  • 考慮一下,當一個進程運行在一個特定處理器時緩存會發生些什麼。

進程最近訪問的數據更新了處理器的緩存,結果,進程的後續內存訪問通常通過緩存來滿足。

  • 再考慮一下,如果進程移到其他處理器會發生什麼。

第一個處理器的緩存設爲無效,第二個處理器緩存應重新填充。並且緩存的無效或重新填充的代價高。
處理器親和性(processor affinity):一個進程對它運行的處理器具有親和性,大多數SMP系統試圖避免將進程從一個處理器移到另一個處理器,而是試圖將一個進程運行在同一個處理器上
軟親和性(soft affinity):一個操作系統試圖保持進程運行在同一個處理器上(但不保證他會這麼做)
硬親和性(hard affinity):允許某個進程運行在某個處理器子集上。

負載平衡

對於SMP系統,重要的是保持所有處理器的負載平衡。
負載平衡設法將負載平均分配到SMP系統的所有處理器上。
推遷移(push migration):對於推遷移,一個特定的任務週期性檢查每個處理器的負載平衡。如果發現不平衡,那麼通過將進程從超載處理器推到空閒或不太忙的處理器上來實現負載平衡
拉遷移(pull migration):空閒處理器從一個忙的處理器上拉一個等待任務

多核處理器

內存停頓(memory stall):當一個處理器訪問內存時,它花費大量時間等待所需數據

如高速緩存未命中

粗粒度(coarse-grained):對於粗粒度的多線程,線程一直在處理器上執行,直到一個長延遲事件(如內存停頓)發生。由於長延遲事件造成的延遲,處理器應切換到另一個線程來開始執行。
細粒度(fine-grainded):細粒度的多線程在更細的粒度級別上(通常在指令週期的邊界上)切換進程。而且,細粒度系統的架構設計有線程切換的邏輯。所以,線程之間切換成本很小。

實時CPU調度

軟實時系統(soft real-time system):不保證會調度關鍵實時進程,而只保證這類進程會優先於非關鍵進程。
硬實時進程(hard real-time system):一個任務應該在它的截止期限之前完成,在截止期限之後完成,與沒有完成,是一樣的。

最小化延遲

事件延遲(event latency):從事件發生到事件得到服務的這段時間
兩種類型的延遲影響實時系統的性能:中斷延遲和調度延遲
中斷延遲(interrupt latency):是從CPU收到中斷處理程序開始的時間

當一箇中斷髮生時,操作系統應先完成正在執行的指令,再確定發生中斷的類型。然後,應保存當前進程的狀態,再採用特定的**中斷服務程序(Interrupt Service Routine, ISR)**來處理中斷。執行這些任務需要的總時間爲中斷延遲。

步驟如下:

  • 確定中斷類型
  • 上下文切換
  • 採用ISR中斷延遲
    調度延遲(dispatch latency):從停止一個進程到啓動另一個進程所需的時間量

優先權調度

實時操作系統最重要的功能是:當一個實時進程需要CPU時,立即響應。因此,用於實時操作系統的調度程序應支持搶佔的基於優先權的算法。

基於優先權的調度算法根據每個進程的重要性而分配優先級,進程越重要,它分配的優先級也就越高。如果調度程序還需要搶佔,並且有一個更高優先級的進程處於就緒,那麼正在運行的,較低優先級的進程會被搶佔。
提供搶佔的,基於優先級的調度算法僅保證軟實時功能。
進程是週期性的,一旦週期性進程獲得CPU,他具有固定的處理時間t,CPU應處理的截止期限d和週期p。
處理時間,截止期限和週期三者之間的關係爲:0<=t<=d<=p。週期任務的速率爲1/p。
調度程序可以根據進程的截止期限或速率要求來分配優先級。

圖5-15

單調速率調度

單調速率算法採用搶佔的,靜態優先級的策略,調度週期性任務。
當較低優先級的進程正在運行並且較高優先級的進程可以運行時,較高優先級進程將會搶佔低優先級。
在進入系統時,每個週期性任務會分配一個優先級,它與其週期成反比。週期越短,優先級越高,週期越長,優先級越低。
這種策略背後的理由是:更頻繁地需要CPU的任務應分配更高的優先級,此外,單調速率調度假定:對於每次CPU執行,週期性進程的處理時間是相同的,也就是說,在每次進程獲取CPU時,它的CPU執行長度是相同的。
下面考慮一個例子:
我們有兩個進程P1,P2。P1和P2的週期分別爲50與100,即P1=50,P2=100,P1和P2的處理時間分別爲T1=20和T2=35。每個進程的截止期限要求,它在下一個週期開始之前完成CPU執行。
是否可能調度這些任務以便每個進程都能滿足截止期限?
假設P2分配比P1更高的優先級。則執行情況如圖
圖5-16
P2首先開始執行並在時間35完成。這時P1開始,在CPU執行時間55完成。然而,P1的第一個截止時間是在時間50,所以調度程序讓P1錯過其截止期限。
假設P1具有更高的優先級,則執行情況如圖:
圖5-17
首先,P1開始,並在時間20完成,從而滿足第一個截止期限。然後P2開始運行,運行到時間50。此時,它被P1搶佔,儘管它的CPU執行仍有5ms的時間。P1在時間70完成CPU執行,然後P2恢復,並在75完成CPU執行,也滿足第一個截止期限。然後,系統一直空閒直到時間100,這時,P1再次被調度。
單調速率調度可認爲是最優的,如果一組進程不能由此算法調度,它不能由任何其他分配靜態優先級的算法來調度。
下面是一組不能使用單調速率算法來調度的進程:
P1=50,T1=25,P2=80,T2=35,且P1具有較高的優先級,執行情況如圖:
圖5-18
最初,P1運行,直到CPU執行時間25完成,進程P2開始運行,運行直到時間50,這時被P1搶佔,P1運行到時間75,P2還有10ms的剩餘,執行到85。因爲超過了時間 80的截止期限。

最早截止期限優先調度

**最早截止期限優先(Earliest-Deadline-First, EDF)**調度根據截止期限動態分配優先級。
截止期限越早,優先級越高;截止期限越晚,優先級越低。
根據PDF策略,當一個進程可運行時,它應向系統公佈截止期限要求。優先級可能需要調整,以便反映新可運行進程的截止期限。

與單調速率調度與EDF調度的不同,前者的優先級是固定的

P1=50,T1=25,P2=80,T2=35,執行情況如圖:
圖5-18
進程P1的截止期限爲最早,所以它的初始優先級比P2的要高。
當P1的CPU執行結束時,進程P2開始運行。P2的下個截止期限爲80,而P1的下個截止期限爲100,所以,P2的優先級更高,可以一直運行到時間60
進程P1在時間60再次開始運行,在時間85完成第二個CPU執行,也滿足第二個期限(時間100)。這時,進程P2開始運行,只是在時間100被P1搶佔。因爲P2的下個截止期限爲160,而P1的截止期限爲150,所以P1的優先級高。
時間125P2恢復執行,時間145,P2完成執行,滿足截止期限。
然後,系統空閒知道時間150,在時間150P1開始再次被調度。

EDF調度在理論上是最佳的,但是在實際中,由於進程的上下文切換和中斷處理的代價,這種級別的CPU利用率是不可能的。

比例分享調度

**比例分享(proprotiona share)**調度程序在所有應用之間分配T股,如果一個應用程序接收N股的時間,那麼確保了它將有N/T的總的處理器時間。

小結

  1. CPU調度四種情況
  2. 調度程序
  3. 5種調度準則
  4. 5種調度算法
  5. 四種實時CPU調度
    1開始再次被調度。

EDF調度在理論上是最佳的,但是在實際中,由於進程的上下文切換和中斷處理的代價,這種級別的CPU利用率是不可能的。

比例分享調度

**比例分享(proprotiona share)**調度程序在所有應用之間分配T股,如果一個應用程序接收N股的時間,那麼確保了它將有N/T的總的處理器時間。

小結

  1. CPU調度四種情況
  2. 調度程序
  3. 5種調度準則
  4. 5種調度算法
  5. 四種實時CPU調度
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章