操作系統筆記二:進程與調度(1)


進程

定義

程序段、數據段、PCB三部分組成了進程實體(進程映像)。一般情況下,我們把進程實體就簡稱為進程,例如,所謂創建進程,實質上是創建進程實體中的PCB;而撤銷進程,實質上是撤銷進程實體中的PCB。

注意:PCB是進程存在的唯一標志。

從不同的角度,進程可以有不同的定義,比較傳統典型的定義有:

  1. 進程是程序的一次執行過程。
  2. 進程是一個程序及其數據在處理機上順序執行時所發生的活動。
  3. 進行是具有獨立功能的程序在數據集合上的運行過程,它是系統進行資源分配和調度的一個獨立單位。

進入進程實體的概念后,可把進程定義為:

進程是進程實體的運行過程,是系統進行資源分配和調度的一個獨立單位。

組成

進程(進程實體)由程序段、數據段、PCB三部分組成。

PCB

操作系統通過PCB來管理進程,因此PCB中包含操作系統對其進行管理所需的各種信息。

  1. 進程描述信息:
    • 進程標識符(PID):當進程被創建時,操作系統會為該進程分配一個唯一的、不重復的ID,用於區分不同的進程(類似於身份證號)
    • 用戶標識符(UID)
  2. 進程控制和管理信息:進程當前狀態、優先級
  3. 資源分配清單:程序段指針、數據段指針、鍵盤、鼠標
  4. 處理機相關信息:
    • 各種寄存器值:當進程切換時需要把進程當前的運行情況記錄下來保存在PCB中,如程序計數器的值表示了當前程序執行到哪一句。

程序段

程序代碼即存在在此

數據段

程序運行時使用、產生的運算數據。如全局變量、局部變量、宏定義的常量就存放在數據段內。

組織

在一個系統中,通常由數十、數百乃至數千個PCB。為了能對他們加以有效的管理,應該用適當的方式把PCB組織起來。

組織方式

  1. 鏈接方式:按照進行狀態將PCB分為多個隊列,操作系統持有指向各個隊列的指針。

    • 執行指針:指向當前處於運行態(執行態)的進程;單CPU計算機中,同一時刻只會有一個進程處於運行狀態。
    • 就緒隊列指針:指向當前處於就緒狀態的進程;通常會把優先級高的進程放在隊頭。
    • 阻塞隊列指針:指向當前處於阻塞態的進程,很多操作系統還會根據阻塞原因不同,再氛圍多個阻塞隊列。

  2. 索引方式:根據進程狀態不同,建立幾張索引表,操作系統持有指向各個索引表的指針。

特征

  • 動態性:進程是程序的一次執行過程,是動態地產生、變化和消亡的。(動態性是進程最基本的特征)
  • 並發性:內存中有多個進程實體,各進程可並發執行。
  • 獨立性:進程是獨立運行、獨立獲得資源、獨立接受調度的最基本單位。(進程是資源分配、接受調度的基本單位)
  • 異步性:各進程按各自獨立的、不可預知的速度向前推進,操作系統要提供"進程同步機制"來解決異步問題。(異步性會導致並發程序執行結果的不確定性)
  • 結構性:每個進程都會配置一個PCB。結構上看,進程由程序段、數據段、PCB組成。

進程的狀態與轉換

進程是程序的一次執行。在這個執行過程中,有時進程正在被CPU處理,有時又需要等待CPU服務,可見,進程的狀態是會有各種變化。為了方便對各個進程的管理,操作系統需要將進程合理地划分為幾種狀態。

狀態

三種基本狀態

  • 運行態(Running):占有CPU,並在CPU上運行

    注意:單核處理機環境下,每一時刻最多只有一個進程處於運行態。(雙核環境下可以同時有兩個進程處於運行態)

  • 就緒態(Ready):已經具備運行條件,但由於沒有空閑CPU,而暫時不能運行

    進程已經擁有了除處理機之外所有需要的資源,一旦獲得處理機,即可立即進入運行態開始運行。即:萬事具備,只欠CPU

  • 阻塞態(Waiting/Blocked,又稱:等待態):因等待某一時間而暫時不能運行

    如:等待操作系統分配打印機、等待讀磁盤操作的結果。CPU是計算機最昂貴的部件,為了提高CPU的利用率,需要先將其他進程需要的資源分配到位,才能得到CPU的服務。

其他兩種狀態

  • 創建態(New,又稱:新建態):進程正在被創建,操作系統為進程分配資源、初始化PCB
  • 終止態(Terminated,又稱:結束態):進程正在從系統中撤銷,操作系統會回收進程擁有的資源、撤銷PCB。

狀態的轉換

進程控制

進程控制的主要功能是對系統中的所有進程實施有效的管理,它具有創建新進程頓號撤銷已有進程、實現進程狀態轉換等功能。

反正進程控制就是要實現進程狀態轉換。

原語實現進程控制。原語的特點是執行期間不允許中斷,只能一氣呵成。

這種不可被中斷的操作即原子操作

原語采用"關中斷指令"和"開中斷指令"實現。

顯然,關/開中斷指令的權限非常大,必然是只允許在核心態下執行的特權指令。(原語運行在核心態)

進程控制相關原語

進程控制會導致進程狀態的轉換。無論哪個原語,要做的無非三類事情:

  1. 更新PCB的信息(如修改進程狀態標志、將運行環境保存到PCB、從PCB恢復運行環境)
    • 所有的進行控制原語一定都會修改進程狀態標志
    • 剝奪當前運行進程的CPU使用權必然需保存其運行環境
    • 某進程開始運行前必然要恢復其運行環境
  2. 將PCB插入合適的隊列
  3. 分配/回收資源

進程的創建

  • 創建原語:申請空白PCB、為新進程分配所需要資源、初始化PCB、將PCB插入就緒隊列
  • 引起進程創建的事件:
    • 用戶登陸:分時系統,用戶登陸成功,系統會建立為其建立一個新的進程
    • 作品調度:多道批處理系統中,有新的作業放入內存時,會為其建立新的進程
    • 提供服務:用戶向操作系統提出其某些請求時,會新建一個進程處理該請求
    • 應用請求:由用戶進程主動請求創建一個子進程

進程的撤銷

  • 撤銷原語:從PCB集合中找到終止的PCB;若進程正在運行,立即剝奪CPU,將CPU分配給其他進程;終止其所有子進程;將該進程擁有的所有資源歸還給父進程或操作系統;刪除PCB
  • 引起進程終止的事件:正常結束、異常結束、外界干預

進程的阻塞和喚醒

  1. 進程的阻塞
    • 阻塞原語:找到要阻塞的進程對應的PCB;保護進程運行現場,將PCB狀態信息設置為"阻塞態",暫停停止進程運行;將PCB插入相應事件的等待隊列
    • 引起該阻塞的事件:需要等待系統分配某種資源,需要等待相互合作的其他進程完成工作
  2. 進程的喚醒
    • 喚醒原語:在事件等待隊列中找到PCB;將PCB從等待隊列移除,設置進程為就緒態;將PCB插入就緒隊列,等待被調度
    • 引起進程喚醒的事件:等待的事件發生

進程的切換

  • 切換原語:將運行環境信息存入PCB;將PCB移入相應隊列;選擇另一個進程執行,並更新其PCB;將PCB恢復新進程所需的運行環境
  • 引起進程切換的事件:當前進程時間片到;有更高優先級的進程到達;當前進程主要阻塞;當前進程終止

線程

傳統的進程是程序執行流的最小基本單位。
引入線程后,線程是一個基本的CPU執行單位,成為程序執行流的最小單位。進程內的各線程之間也可以 並發,從而進一步提升了系統的並發性。進程只作為除CPU之外的系統資源的分配單位。

變化

1. 資源分配:

  1. 傳統進程機制中,進程只是資源分配,調度的基本單位
  2. 引入線程后,進程是資源分配的基本單位,線程是調度的基本單位

2. 並發性

  1. 傳統進程機制中,只能進程間並發
  2. 引入線程后,各線程間也能並發,提升了並發度

3. 系統開銷

  1. 傳統及進程間並發,需要切換進程的運行環境系統開銷很大
  2. 線程間並發,如果是同一進程內的線程切換,則不需要切換進程環境,系統開銷小
  3. 引入線程后,並發所帶來的系統開銷減少

屬性

  1. 線程是處理機調度的基本單位
  2. 多CPU計算機中,各個線程可占用 不同的CPU
  3. 每個線程都有一個線程ID,線程控制塊(TCB)
  4. 線程也有就緒,阻塞,運行三種基本狀態
  5. 線程幾乎不擁有系統資源
  6. 同一進程的不同線程間共享進程的資源
  7. 由於共享內存地址資源,同一進程中的線程通信甚至無需系統干預
  8. 同一進程中的線程切換,不會引起進程切換
  9. 不同進程的線程切換,會引起進程切換
  10. 切換同進程內的線程,系統開銷很小
  11. 切換進程,系統開銷較大

實現方式

用戶級線程(User-Level Thread,ULT)
image-20201201161648081
用戶級線程由應用程序通過線程庫實現。
所有線程管理工作都有應用程序負責(包括線程切換)
用戶級線程中,線程切換可以在用戶態即可完成,無需操作系統干預。
在用戶看來,是有多個 線程。但是在 操作系統內核看來,並意識不到線程的存在。(用戶級線程對用戶不透明,對操作系統透明)
可以這樣理解,“用戶級線程”就是“從用戶角度能看到的線程

內核級線程(Kernel-Level Thread,KLT,又稱“內核支持的線程)

內核級線程的管理由操作系統內核完成。線程調度,切換等工作都由內核負責,因此內核級線程的切換必然需要在核心態下才能完成。
可以這樣理解,“內核級線程”就是“從操作系統內核視角看能看到的線程

在同時支持用戶級線程和內核級線程的系統,可采用二者結合的方式:將n個用戶級線程映射到m個內核級線程上(n>=m)
image-20201201161709652
重點重點重點:操作系統只“看得見”內核級線程 ,因此只有內核級線程才是處理機分配的單位。

多線程模型

多對一模型:多個用戶及線程映射到一個內核級線程。每個用戶進程只對應一個內核級線程。
image-20201201161728766
優點:用戶級線程的切換在用戶空間即可完成,不需要切換到核心態,線程管理的系統開銷小,效率高
缺點:當一個用戶級線程被阻塞后,整個進程都會被阻塞,並發度不高。多個線程不可在多核處理機上並行運行

一對一模型:一個用戶及線程映射到一個內核級線程。每個用戶進程有與用戶級線程同數量的內核級線程。
image-20201201161748978
優點:當一個線程被阻塞后,別的線程還可以繼續執行,並發能力強。多線程可在多核處理機並行執行。
缺點:一個用戶進程會占用多個內核級線程,線程切換有操作系統內核完成,需要切換到核心態,因此線程管理的成本高,開銷大。

多對多模型:n用戶及線程映射到m個內核級線程(n>=m)。每個用戶進程對應m個內核級線程。
image-20201201161919270
克服了多對一模型並發度不高的缺點,又克服了一對一模型中一個用戶進程占用太多內核級線程,開銷太大的缺點。

處理機調度

基本概念

在多道程序系統中,進程的數量往往 是多於處理機的個數的,這樣不可能同時並行地處理各個進程。處理機調度,就是從就緒對了按照一定的算法選擇一個進程並將處理機分配給它運行,以實現進程的並發執行。

三個層次

高級調度:
高級調度(作業調度),按一定的原則從外存上處於后備隊列的作業挑選一個(或多個)作業,給他們分配內存等必要資源,並建立相應的進程(建立PCB),以使它(們)獲得競爭處理機的權利
高級調度是輔存(外存)與內存之間的調度。每次作業只調入一次,調出 一次。作業調入時會建立相應的PCB,作業調出時才撤銷PCB。高級調度主要是指掉入的問題,因為只有調入的時機需要操作系統來確定,但調出的時機必然是作業運行結束才調出。
中級調度:
引入虛擬存儲技術之后,可將暫時不能運行的進程調至外存等待。等它重新具備了運行條件且內存又稍有空閑時,再重新調入內存。
這樣做的目的是為了提高內存利用率和系統吞吐量
暫時調到外存等待進程狀態為掛起狀態。值得注意的是,PCB並不會一起調到外存,而是會常駐內存。PCB中會記錄進程數據在外存中存放位置,進程狀態等信息,操作系統通過內存中的PCB來保持對各個進程的監控,管理。被掛起的進程PCB會被放到的掛起隊列中。
中級調度(內存調度),就是要決定將哪個處於掛起狀態的進程重新調入內存。

低級調度(進程調度),其主要任務是按照某種方法和策略從就緒隊列中選取一個進程,將處理機分配給它。

進程調度是操作系統中最基本的一種調度,在一般的操作系統中都必須配置進程調度。

進程調度的頻率很高,一般幾十毫秒一次。

掛起態與七狀態模型(補充知識)

暫時調到外存等待的進程狀態為掛起狀態(掛起態,suspend)

掛起態又可以進一部細分為就緒掛起、阻塞掛起兩個狀態

五狀態模型->七狀態模型

image-20201201162741960

三次調度的聯系、對比

要做什么 調度發生在 發生頻率 對進行狀態的影響
高級調度
(作業調度)
按照某種規則,從后備隊列中選擇合適的作業將其調入內存,並為其創建進行 外存->內存
(面向作業)
最低 無->創建態->就緒態
中級調度
(內存調度)
按照某種規則,從掛起隊列中選擇合適的進行將其數據調回內存 外存->內存
(面向進程)
中等 掛起態->就緒態
(阻塞掛起->阻塞態)
低級調度
(進程調度)
按照某種規則,從就緒隊列中選擇一個進行為其分配處理器 內存->CPU 最高 就緒態->運行態

進程調度的時機

進程調度(低級調度),就是按照某種算法從就緒隊列中選擇一個進程為其分配處理器。

需要進行進程調度與切換的情況:

  1. 當前運行的進程主動放棄處理機
    • 進程正常終止
    • 運行過程中發生異常而終止
    • 進程主動請求阻塞(如 等待I/O)
  2. 當前運行的進程被動放棄處理機
    • 分給進程的時間片用完
    • 有更緊急的事需要處理(如 I/O中斷)
    • 有更高優先級的進程進入就緒隊列

不能進行進程調度與切換的情況:

  1. 處理中斷的過程中。中斷處理過程復雜,與硬件密切相關,很難做到在中斷處理過程中進行進程切換。
  2. 進程在操作系統內核程序臨界區中。
  3. 原子操作過程中(原語)。原子操作不可中斷,要一氣呵成(如之前講過的修改PCB中進程狀態標志,並把PCB放到相應隊列)

進程在操作系統內核程序臨界區不能進行調度與切換。

臨界資源:一個時間段內只允許一個進程使用的資源。各進程需要互斥地訪問臨界資源。

臨界區:訪問臨界資源的那段代碼。

內核程序臨界區一般是用來訪問某種內核數據結構的,比如進程的就緒隊列(由各就緒進程的PCB組成)

image-20201202204249506

  • 如果還沒退出臨界區(還沒解鎖)就進行進程調度,但是進程調度相關的程序也需要訪問就緒隊列,但此時就緒隊列被鎖住了,因此又無法順利進行進程調度。
  • 內核程序臨界區訪問的臨界資源如果不盡快釋放的話,極有可能影響到操作系統內核的其他管理工作。因此在訪問內核程序臨界區期間不能進行調度與切換。

image-20201202204615131

  • 在打印機打印完成之前,進程一直處於臨界區內,臨界資源不會解鎖。但打印機又是慢速設備,此時如果一直不允許進程調度的話就會導致CPU一直空閑。
  • 普通臨界區訪問的臨界資源不會直接影響操作系統內核的管理工作。因此在訪問普通臨界區時可以進程調度與切換。

進程調度的方式

  • 非剝奪調度方式,又稱非搶占方式。即,只允許進程主動放棄處理機。在運行過程中即便有更緊迫的任務到達,當前進程依然會繼續使用處理機,直到該進程終止或主動要求進入阻塞態。

    實現簡單,系統開銷小但是無法及時處理緊急任務,適合於早期的批處理系統。

  • 剝奪調度方式,又稱搶占方式。當一個進程正在處理機上執行時,如果有一個更重要或更緊迫的進程需要使用處理機,則立即暫時正在執行的進程,將處理機分配給更重要緊迫的那個進程。

    可以優先處理更緊急的進程,也可以實現讓各進程按時間片輪流執行的功能(通過時鍾中斷)。適合於分時操作系統、實時操作系統。

進程的切換與過程

“狹義的進程調度”與“進程切換”的區別:

  • 狹義的進程調度指的是從就緒隊列中選中一個要運行的進程。(這個進程可以是剛剛被暫停執行的進程,也可能是另一個進程,后一種情況就需要進程切換
  • 進程切換是指一個進程讓出處理機,由另一個進程占用處理器的過程。
  • 廣義的進程調度包含選擇一個進程和進程切換兩個步驟。

進程切換的過程主要完成了:

  1. 對原來運行進程各種數據的保存
  2. 對新的進程各種數據的恢復(如:程序計數器、程序狀態字、各種數據寄存器等處理機現場信息,這些信息一般保存在進程控制塊)

注意:進程切換是有代價的,因此如果過於頻繁的進行進程調度、切換,必然會使整個系統的效率降低,使系統大部分時間都花在了進程切換上,而真正用於執行進程的時間減少。

調度算法的評價指標

CPU利用率

由於早期的CPU造價極其昂貴,因此人們會希望讓CPU盡可能多地工作。

CPU利用率:指CPU"忙碌"的時間占總時間的比例

\[利用率=\frac{忙碌的時間}{總時間} \]

系統吞吐量

對於計算機來說,希望能用盡可能少的時間處理完盡可能多的作業

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

\[系統吞吐量=\frac{總共完成了多少道作業}{總共花了多少時間} \]

周轉時間

對於計算機的用戶來說,他很關心自己的作業從提交到完成花了多少時間。

周轉時間,是指從作業被提交給系統開始,到作業完成為止的這段時間間隔。

它包括四個部分:作業在外存后備隊列上等待作業調度(高級調度)的時間、進程在就緒隊列上等待進程調度(低級調度)的時間、進程在CPU上執行的時間、進程等待I/O操作完成的時間。后三項在一個作業的整個處理過程中,可能發生多次。

\[(作業)周轉時間=作業完成時間-作業提交時間 \]

\[平均周轉時間=\frac{各作業周轉時間之和}{作業數} \]

\[帶權周轉時間=\frac{作業周轉時間}{作業實際運行的時間}=\frac{作業完成時間-作業提交時間}{作業實際運行的時間} \]

(帶權周轉時間必然\(\ge1\),帶權周轉時間與周轉時間都是越小越好)

\[平均帶權周轉時間=\frac{各作業帶權周轉時間之和}{作業數} \]

等待時間

計算機用戶希望自己的作業盡可能少的等待處理機

等待時間,指進程/作業處於等待處理機狀態時間之和,等待時間越長,用戶滿意度越低。

對於進程來說,等待時間就是指進程建立后等待被服務的時間之和,在等待I/O完成的期間其實進程也是在被服務的,所以不計入等待時間。

對於作業來說,不僅要考慮建立進程后的等待時間,還要加上作業在外存后備隊列中等待的時間

一個作業總共需要被CPU服務多久,被I/O設備服務多久一般是確定不變的,因此調度算法其實只會影響作業/進程的等待時間。當然,與前面指標類似,也有“平均等待時間”來評價整體性能。

響應時間

對於計算機用戶來說,會希望自己的提交的請求(比如通過鍵盤輸入了一個調試命令)盡早地開始被系統服務、回應。

響應時間,指從用戶提交請求首次產生響應所用的時間。

調度算法

前三種算法一般適合用於早期的批處理系統

先來先服務(FCFS)

  • 算法思想:主要從“公平”的角度考慮(類似於我們生活中排隊買東西)
  • 算法規則:按照作業/進程到達的先后順序進行服務
  • 用於作業/進程調度:用於作業調度時,考慮的是哪個作業先到達后備隊列;用於進程調度時,考慮的時哪個進程先到達就緒隊列。
  • 是否可搶占:非搶占式的算法
  • 優缺點:
    • 優點:公平、算法實現簡單
    • 缺點:排在長作業(進程)后面的短作業需要等待很長時間,帶權周轉時間很大,對短作業來說用戶體驗不好。即,FCFS算法對長作業有利,對短作業不利
  • 是否會導致飢餓:不會

短作業優先(SJF,Shortest Job First)

  • 算法思想:追求最少的平均等待時間,最少的平均周轉時間、最少的平均帶權周周轉時間
  • 算法規則:最短的作業/進程優先得到服務(所謂“最短”,式指要求服務時間最短)
  • 用於作業/進程調度:即可用於作業調度,也可用於進程調度。用於進程調度時稱為“短進程優先(SPF,Short Process First)算法”
  • 是否可搶占:SJF和SPF是非搶占式的算法。但是也有搶占式的版本--最短剩余時間優先算法(SRTN,Shorted Remaining Time Next)
  • 優缺點:
    • 優點:"最短的"平均等待時間、平均周轉時間
    • 缺點:不公平。對短作業有利,對長作業不利。可能產生飢餓現象。另外,作業/進程的運行時間是由用戶提供的,並不一定真實,不一定能做到真正的短作業優先。
  • 是否會導致飢餓:會。如果源源不斷地有短作業/進程到來,可能使長作業/進程長時間得不到服務,產生“飢餓”現象。如果一直得不到服務,則稱為“餓死”。

最短剩余時間優先算法:每當有進程加入就緒隊列改變時需要調度,如果新達到的進程剩余時間比當前運行的進程剩余時間更短,則由新進程搶占處理機,當前運行進程重新回到就緒隊列。另外,當一個進程完成時也需要調度

注意幾個小細節:

  1. 如果題目中未特別說明,所提到的“短作業/進程優先算法”默認非搶占式的。

  2. 所有進程同時可運行/都幾乎同時到達時,采用SJF調度算法的平均等待時間、平均周轉時間最少。

    搶占式的短作業/進程優先調度算法(最短剩余時間優先,SRNT算法)的平均等待時間、平均周轉時間最少。

  3. 雖然嚴格來說,SJF的平均等待時間、平均周轉時間並不一定最少,但相比於其他算法(如FCFS),SJF依然可以獲得較少的平均等待時間、平均周轉時間

高相應比優先(HRRN,Highest Response Ratio Next)

  • 算法思想:要綜合考慮作業/進程的等待時間和要求服務的時間
  • 算法規則:在每次調度時先計算各個作業/進程的響應比,選擇響應比最高的作業/進程為其服務。\(響應比=\frac{等待時間+要求服務時間}{要求服務時間} \ge1\)
  • 用於作業/進程調度:即可用於作業調度,也可用於進程調度。
  • 是否可搶占:非搶占式的算法。因此只有當前運行的作業/進程主動放棄處理機時,才需要調度,才需要計算響應比。
  • 優缺點:
    • 綜合考慮了等待時間和運行時間(要求服務時間)
    • 等待時間相同時,要求服務時間短的優先(SJF的優點)
    • 要求服務時間相同時,等待時間長的優先(FCFS的優點)
    • 對於長作業來說,隨着等待時間越來越久,其響應比也會越來越大,從而避免了長作業飢餓的問題。
  • 是否會導致飢餓:不會

后三種算法適合用於交互式系統

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

  • 算法思想:公平地、輪流地為各個進程服務,讓每個進程在一定時間間隔內都可以i得到響應
  • 算法規則:按照各進程到達就緒隊列的順序,輪流讓各個進程執行一個時間片(如100ms)。若進程末在一個時間片內執行完,則剝奪處理機,將進程重新放到就緒隊列隊尾重新排隊。
  • 用於作業/進程調度:用於進程調度(只有作業放入內存建立了相應的進程后,才能被分配處理機時間片)
  • 是否可搶占:若進程未能在時間片內運行完,將被強行剝奪處理機使用權,因此時間片輪轉調度算法屬於搶占式的算法。由時鍾裝置發出時鍾中斷來通知CPU時間片已到。
  • 優缺點:
    • 優點:公平;響應快,適用於分時操作系統;
    • 缺點:由於高頻率的進程切換,因此有一定開銷;不區分任務的緊急程度。
  • 是否會導致飢餓:不會
  • 補充
    • 如果時間片太多,使得每個進程都可以在一個時間片內就完成,則時間片輪轉調度算法退化成先來先服務調度算法,並且會增大進程響應時間。因此時間片太大
    • 另一方面,進程調度、切換是有時間代價的(保存、恢復運行環境),因此如果時間片太小,會導致進程切換過於頻繁,系統會花大量的時間來處理進程切換,從而導致實際用於進程執行的時間比例減少。可見時間片也不能太小
    • 一般來說,設計時間破時要讓切換進程的開銷占比不超過1%。

優先級調度算法

  • 算法思想:隨着計算機的發展,特別是實時操作系統的出現,越來越多的應用場景需要根據任務的緊急程度來決定處理順序。

  • 算法規則:調度時選擇優先級最高的作業/進程。

  • 用於作業/進程調度:即可用於作業調度,也可用於進程調度。甚至,還會用於在之后會學習的I/O調度中。

  • 是否可搶占:搶占式、非搶占式都有。非搶占式只需在進程主動放棄處理機時進程調度即可,而搶占式還需在就緒隊列變化時,檢查是否會發生搶占。

  • 優缺點:

    • 優點:用優先級區分緊急程度、重要程度,適用於實時操作系統。可靈活地調整對各種作業/進程的偏好程度。
    • 缺點:若源源不斷地有高優先級進程到來,則可能導致飢餓。
  • 是否會導致飢餓:會

  • 補充

    • 就緒隊列未必只有一個,可以按照不同優先級來組織。另外,也可以把優先級高的進程排在更靠近隊頭的位置。

    • 根據優先級是否可以動態改變,可將優先級分為靜態優先級動態優先級兩種。

      靜態優先級:創建進程時確定,之后一直不變。

      動態優先級:創建進程時有一個初始值,之后會根據情況動態地調整優先級。

    • 通常:系統進程優先級高於用戶進程;前台進程優先級高於后台進程;操作系統更偏好I/O型進程(或稱I/O繁忙型進程)

      注:與I/O型進程相對的時計算型進程(或稱CPU繁忙型進程)

    • 可以從追求公平、提高資源利用率等角度考慮

      如果某進程在就緒隊列中等待了很長時間,則可以適當提升其優先級;

      如果某進程占用處理機運行了很長時間,則可適當降低其優先級;

      如果發現一個進程頻繁地進行I/O操作,則可適當提升其優先級。

多級反饋隊列調度算法

  • 算法思想:對其他調度算法的折中權衡
  • 算法規則:
    1. 設置多級就緒隊列,各級隊列優先級從高到低,時間片從小到大
    2. 新進程到達時先進入第1級隊列,按FCFS原則排隊等待被分配時間片,若用完時間片進程還未結束,則進程進入下一級隊列隊尾。
    3. 只有第k級隊列為空時,才會為k+1級隊頭的進程分配時間片
  • 用於作業/進程調度:用於進程調度
  • 是否可搶占:搶占式的算法。在k級隊列的進程運行過程中,若更上級的隊列(1~k-1級)中進入了一個新進程,則由於新進程處於優先級更高的隊列中,因此新進程會搶占處理機,原來運行的進程放回k級隊列隊尾。
  • 優缺點:
    • 對各類型進程相對公平(FCFS的優點)
    • 每個新到達的進程都可以很快就得到響應(RR的優點)
    • 短進程只用較少的時間就可完成(SPF的優先)
    • 不必實現估計進程的運行時間(避免用戶作假)
    • 可靈活地調整對各類進程的偏好程度,比如CPU密集型進程、I/O密集型進程(拓展:可以將因I/O而阻塞的進程重新放回原隊列,這樣I/O型進程就可以保持較高優先級)
  • 是否會導致飢餓:會


免責聲明!

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



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