1. 程式人生 > >作業系統之程序的排程與死鎖

作業系統之程序的排程與死鎖

一. 作業系統引論

作業系統是一組能有效阻止和管理計算機硬體和軟體資源,合理地把對各類作用進行排程,以及方便使用者使用的程式的集合。

1. 作業系統的目標與作用

  • 在計算機系統上配置作業系統,其主要目標就是:方便性、有效性、可擴充性和開放性
    • 方便性:一個未配置的計算機系統是極難使用的。配置了作業系統之後,系統便可使用編譯命令將使用者採用高階語言編寫的程式翻譯成機器程式碼,或直接通過OS所提供的各種命令操縱計算機,極大地方便了使用者。
    • 有效性:提高系統資源利用率以及洗脫嫩肉吞吐量。
    • 可擴充性:能方便的新增新的功能和模組,以及對原有的功能進行新增和修改。
    • 開放性:指系統能遵循世界標準規範。
  • 作業系統的作用
    • 作為使用者與計算機硬體作業系統之間的介面。使用者可以通過OS來使用計算機硬體。
    • 作為計算機系統資源的管理者。這些資源主要分為:處理機、儲存器、I/O裝置以及檔案(資料和程式)。
    • 實現了對計算機資源的抽象

2. 作業系統的發展過程

  • 人工操作方式:人工的輸入輸出,使用者獨佔全機。
  • 離線輸入/輸出方式:引入了高速的磁帶。減少了CPU的空閒時間,提高了I/O速度。
  • 單道批處理系統:實現對作業的連續處理,系統中的資源得不到充分利用。
  • 多道批處理系統:多道作業存放於外存的後備佇列,有作業排程選擇若干個作業調入記憶體,資源利用率高,系統吞吐量大,但是平均週轉時間長,無互動能力。
  • 分時系統:滿足使用者對人-機互動的需求。是指在一臺主機連線了多個配有顯示器和鍵盤的終端並由此所組成的系統,該系統允許多個使用者同時通過自己的終端,以互動的方式使用計算機,共享主機中的資源。
  • 實時系統:是指系統能及時響應外部事件的請求,在規定時間內完成對該事件的處理,並控制所有實時任務協調一致地執行。

3. 作業系統的基本特性

上面介紹的多道批處理系統、分時系統和實時系統各自有各自的特點,但同時,他們還共同具有併發、共享、虛擬和非同步四個基本特徵。

  • 併發:系統中的程式能夠併發的執行,使得OS能有效地提高系統的資源利用率,增加系統的吞吐量。
    • 併發性:是指兩個或多個事件在同一時間間隔內發生。
    • 並行性:指兩個或多個事件在同一時刻發生。倘若在計算系統中有多個處理機,這些可以併發執行的程式便可分配到多個處理機上實現並行執行。
    • 在未引入程序時,對於同屬於一個應用程式中的兩個程式只能順序執行。引入程序,對記憶體中的多個程式分別建立一個程序,他們就可以併發的執行,極大地提高了系統資源利用率和系統吞吐量。
  • 共享性:是指系統中的資源可供記憶體中 多個併發執行的程序共同使用。主要實現方式:
    • 互斥共享:在一段時間內,只允許一個程序訪問該資源,我們成該種資源為臨界資源。
    • 同時訪問
    • 併發和共享是多使用者OS的兩個最基本的特徵。
  • 虛擬性:採用時分複用技術和空分複用技術實現。
    • 時分複用技術是通過利用處理機的空閒時間執行其他程式,提高了處理機的利用率。
    • 空分複用技術則是利用儲存器的空閒時間分割槽域存放和執行其他的多道程式,以此來提高記憶體的利用率。
  • 非同步性:程序以人們不可預知的速度向前推進,也就是使用者不知道程序在何時獲得CPU。

4. 作業系統的主要功能

引入OS的目的是為多道程式的執行提供良好的執行環境,以保證多道程式能有條不紊的執行,並能最大程度的提高系統中各種資源的利用率,方便使用者的使用。OS具有處理機管理、儲存器管理、裝置管理、檔案管理以及使用者介面五大功能。

  • 處理機管理的主要功能:程序控制,程序同步,程序通訊以及程序排程。
  • 儲存器管理的主要功能:記憶體分配,記憶體保護,地址對映,記憶體擴充。
  • 裝置管理的主要功能:緩衝管理,裝置分配,裝置處理。
  • 檔案管理的主要功能:檔案儲存空間的管理,目錄管理,檔案的讀寫管理和保護。
  • 介面的主要功能:提供使用者介面和程式介面。

二. 程序的描述與控制

1. 程序與執行緒

為了能使程式併發的執行,並且可以對併發執行的程式加以控制,引入程序。為了使參與併發執行的每個程式都能獨立執行,為每個程序配置一個程序控制塊PCB,用PCB來描述程序的基本情況和活動過程,進而控制和管理程序。這樣由程式段、相關的資料段和PCB三部分構成了程序實體。

  • 程序的定義
    • 程序是程式的一次執行。
    • 程序是一個程式及其資料在處理上順序執行時所發生的的活動。
    • 程序是具有獨立功能的程式在一個數據集合上執行的過程它是系統進行資源分配的獨立單位。

引入執行緒的目的是減少程式在併發執行時所付出的時空開銷,使OS具有更好的併發性。

  • 程序建立,系統為它分配其所必需的、除處理機以外的所有資源,以及建立相應的PCB。
  • 程序撤銷,必須對其所佔有的資源執行回收操作,然後撤銷PCB。
  • 程序切換,對進城進行上文切換時,需要保留當前程序的CPU,設定新選程序的CPU環境,因此需要花費不少的處理機時間。

程序是一個資源的擁有者,如果頻繁的進行建立撤銷切換會造成很大的時空開銷。所以,引入執行緒,將執行緒作為排程和分派的基本單位,程序作為資源分配的獨立單位。

2. 程式、程序、執行緒的比較

首先程式與程序的區別:

  • 程序具有程式所沒有的PCB,程序是程式的一次執行。
  • 動態性:
    • 程序的實質是程序實體的執行過程,動態性表現在:程序由建立而產生,由排程而執行,由撤銷而消亡。可見程序具有一定的生命週期。
    • 程式是一組有序指令的集合,並存放於某種介質智商,其本身並不具有活動的意義,是靜態的。
  • 併發性:
    • 多個程序同存在於記憶體中,且能在一段時間內同時執行。
    • 程式沒有建立PCB不能參與併發執行。
  • 獨立性:
    • 程序實體是一個能獨立執行、獨立獲得資源的基本單位。
    • 凡未建立PCB的程式都不能作為一個獨立執行的單位參與執行。
  • 非同步性:
    • 程序是按非同步的方式執行的,即按各自獨立的、不可預知的速度向前推進。
    • 程式若參與併發執行,會產生其結果的不可再現性。

其次是程序與執行緒的區別:

  • 排程的基本單位:
    • 程序是資源分配的基本單位。
    • 執行緒是排程和分派的基本單位。執行緒切換僅需要儲存和設定少量的暫存器。在同一程序中執行緒的切換不會引起程序的切換,不同程序中執行緒的切換則會引起程序的切換。
  • 併發性:
    • 不僅程序與程序之間可以併發執行,而且在一個程序中的多個執行緒之間也可以併發執行。
  • 擁有資源:
    • 程序是系統中擁有資源的基本單位。
    • 執行緒並不擁有系統資源,而是僅有一點必不可少的、能保證獨立執行的資源,比如TCB、用於PC、保留區域性變數、少數狀態引數和返回地址等的一組暫存器和棧。
  • 獨立性:
    • 每個程序都擁有獨立的地址空間和其他資源。除了共享全域性變數以外,不允許其他程序訪問。
    • 執行緒除了擁有少量資源外,還可以屬於同一個程序的所有執行緒都具有相同的地址空間。並且可以訪問所屬程序的所有資源。
  • 系統開銷:
    • 程序的建立、撤銷所付出的開銷遠比執行緒大。
    • 同一程序裡的執行緒具有相同的地址空間,執行緒的切換比程序的切換代價小。
  • 支援多處理機系統:
    • 在多處理機系統上,對於傳統的程序,不管有多少處理機,該程序只能執行在一個處理機上。
    • 但對於多執行緒程序,就可以將一個程序中的執行緒分配到多個處理機上,使他們並行執行,可以加速程序的完成。

3. 程序的狀態

1) 程序的三種基本狀態:

  • 就緒狀態:程序已經分到除CPU以外的所有必要的資源,只要在獲得CPU,便可立即執行。
  • 執行狀態:指程序已經獲得CPU,其程式正在執行。
  • 阻塞狀態:指正在執行的程序由於發生某件事(如I/O請求、申請緩衝區失敗等)暫時無法繼續執行時的狀態。

程序的三種基本狀態及其轉換如下圖:

這裡寫圖片描述

2) 為了滿足程序控制塊對資料及操作的完整性要求以及增強管理的靈活性,引入了建立狀態和終止狀態。

  • 建立狀態:保證程序的排程必須在建立工作完成後進行,以確保對程序控制塊操作的完整性。獲得所需要的資源以及對PCB的初始化工作完成之後,便可由建立狀態進入就緒狀態。
  • 終止狀態:等待作業系統進行善後處理,最後將PCB清零,並將PCB空間返還系統。

程序的五種基本狀態以及轉換如下圖:

這裡寫圖片描述

3) 掛起狀態的引入:增加記憶體容量,實現虛擬記憶體。掛起是將程序調至記憶體外,從而保證記憶體充足。

引入掛起狀態之後的狀態裝換圖如下:

這裡寫圖片描述

4. 程序同步

程序同步機制的主要任務,是對多個相關程序在執行次序上進行協調,使併發執行的諸程序之間能按照一定的規則共享系統資源,並能很好地相互合作,從而是程式的執行具有可再現性。

1) 兩種形式的制約關係

  • 間接相互制約關係:多個程式在併發執行時,由於共享系統資源,只是這些併發執行的程式之間形成相互制約的關係,多個程序互斥的訪問這些資源。
  • 直接相互制約關係:多個程序一同合作為了完成某個任務,這些程序在完成任務上有一定的時間順序。有些程序要在其他程序的後才能開始。

2)同步機制應遵循的規則:

  • 空閒讓進
  • 忙則等待
  • 有限等待
  • 讓權等待

3) 硬體同步機制

  • 關中斷
  • 利用Test-and-Set指令實現互斥
  • 利用Swap指令實現程序互斥

4) 訊號量機制

  • 整型訊號量:執行時不可中斷。描述如下:
wait(S){
    while(S<=0);
    S--;
}
signal(S){
    S++;
}

wait(S)和signal(S)是兩個原子操作,不符合“讓權等待”原則。

  • 記錄型訊號量:採用記錄型資料結構。描述如下:
typedef struct{
    int value;
    struct process_control_block *list;
}semaphore;

wait(semaphore * S){
    S->value --;
    if(S-value < 0) block(S->list);
}
signal(semaphore * S){
    S->value ++;
    if(S->value <= 0) wakeup(S->list);
}
  • AND型訊號量:江金城在整個執行過程中所需要的所有資源,一次性全部地分給程序,帶程序使用完後在一起釋放。
  • 訊號量集

5) 訊號量的應用

  • 利用訊號量實現程序互斥,使多個程序能互斥的訪問某臨界資源。
  • 利用訊號量實現前驅關係。

5. 程序經典同步問題

  • 生產者-消費者問題
  • 哲學家進餐問題
  • 讀者-寫者問題

6. 程序通訊

程序通訊型別:

  • 共享儲存器系統
  • 管道通訊系統
  • 訊息傳遞系統
  • 客戶機-伺服器系統

三. 處理機排程與死鎖

1.處理機排程的層次與排程演算法的目標

1) 處理機排程的層次

  • 高階排程:又稱長排程或作業排程,物件時作業,從後備佇列中選擇幾個作業調入記憶體,為他們建立程序、分配必要的資源,並將它們放入就緒列表。主要用於多道批處理系統中,分時和實時系統中並不設定高階排程。
  • 低階排程:又稱為程序排程或短程排程,物件是程序或執行緒,從就緒佇列中選擇一個程序獲得處理機。在多道批處理、分時、實時系統中,都必須配置這級排程。
  • 中級排程:又稱記憶體排程,把那些暫時不能執行的程式調至外存等待。此時程序的狀態稱為掛起狀態,當他們具備執行條件且記憶體有稍有空閒時,由中級排程來決定把外村上的那些具備執行條件的就緒程序重新調入記憶體,置為就緒狀態。目的是:提高記憶體利用率和系統吞吐量。

2) 處理機排程演算法的目標

  • CPU利用率:

    CPU=CPUCPU+CPU
  • 週轉時間:是指作業被提交給系統開始,到作業完成為止的這段時間。

  • 平均週轉時間:T=
  • 帶權週轉時間:作業的週轉時間T與系統為它提供服務的時間Ts之比。
  • 平均帶權週轉時間為:各個帶權週轉時間的和/作業個數。

2. 作業排程

1) 作業執行的三個階段為收容、執行、完成。作業的三種狀態對應為後備狀態、執行狀態、完成狀態。

2) 作業排程的主要任務是決定接納多少個作業以及接納哪些作業這兩個問題。

3) 作業排程的演算法如下:

  • 先來先服務(FCFS)
  • 短作業優先(SJF)
  • 優先順序排程演算法(PSA):系統從後備佇列中選擇若干個優先順序較高的裝入記憶體。
  • 高響應比優先排程演算法(HRRN):既考慮了作業的等待時間有考慮了作業的執行時間,引入一個動態優先順序:
    =+

由於等待時間與服務時間之和就是系統對該作業的響應時間,故優先順序又相當於響應比Rp,Rp又可以如下表示:

Rp==

3. 程序排程

1) 程序排程的任務有三如下:

  • 儲存處理機的現場資訊。
  • 按某種演算法選取程序。
  • 把處理器分配給程序。

2) 程序排程方式

  • 非搶佔方式:一旦把處理機分給某程序後,就一直讓它執行下去,決不會因為時鐘中斷或任何其他原因去搶佔當前正在執行程序的處理機,直至該程序完成,或者發生某件事而被阻塞時,才把處理機分配給其它程序。
  • 搶佔方式:允許排程程序根據某種原則去暫停正在執行的程序,將分配給該程序的處理及重新分配給另一程序。然而搶佔要遵循的原則:
    • 優先權原則。
    • 短作業優先原則。
    • 時間片原則。

3) 排程演算法

  • 輪轉排程演算法:分時系統中較常用的排程方法,很公平,讓就緒佇列上的每一個程序每次僅執行一個時間片。
    • 系統將所有的就緒程序按FCFS策略排成一個就緒佇列,系統設定每隔一定時間 便產生一次中斷,去啟用程序排程程式進行排程,把CPU分給隊首程序,讓他執行一個時間片。
    • 若時間片還沒用完,程序便已經完成,則立即排程下一下程序。
    • 若時間片已經用完,而程序還沒有完成,則把該程序送往就緒佇列的隊尾。
  • 優先順序排程演算法:靜態優先順序和動態優先順序。
  • 多佇列排程演算法:設定多個就緒佇列,對每個就緒佇列實施不同的排程演算法。
  • 多級反饋佇列:設定多個就緒佇列,每個佇列的優先順序不一樣,優先順序越高的佇列中其時間片就越小,每個佇列採用FCFS演算法。

4. 實時排程

1) 實時排程演算法的分類

  • 非搶佔式排程演算法:
    • 非搶佔式輪轉式排程演算法。
    • 非搶佔式優先排程演算法。
  • 搶佔式排程演算法:
    • 基於時鐘終端的搶佔式優先順序排程演算法。
    • 立即搶佔的優先順序排程演算法。

2) 實時排程演算法

  • 最早截止時間優先EDF演算法:
    • 根據任務的截止時間確定任務的優先順序。任務的截止時間最早其優先順序越高。
    • 分非搶佔式和搶佔式
  • 最低鬆弛度優先LLF演算法:
    • 根據任務的緊急程度,任務緊急程度越高,賦予該任務的優先順序就越高。
    • 該演算法主要用於可搶佔式排程方式中
    • 鬆弛度= 必須完成時間 - 其本身的執行時間 - 當前時間

5. 死鎖概述

  • 死鎖的定義:
    • 如果一組程序中的每一個程序都在等待僅有該組程序中的其他程序才能引發的事件,那麼該組程序是死鎖的。
  • 產生死鎖的原因:
    • 資源競爭。
    • 程序推進順序不當。
  • 產生死鎖的必要條件:
    • 互斥條件。
    • 請求和保持。
    • 不可搶佔。
    • 迴圈等待條件。
  • 處理死鎖的方法:
    • 預防死鎖:設定某些限制條件去破壞產生死鎖的四個必要條件中的一個或幾個來預防產生死鎖。
    • 避免死鎖:同樣是事先預防策略,在資源動態分配的過程中,用某種方法防止系統進入不安全狀態。從而避免死鎖。
    • 檢測死鎖:允許程序在執行過程中發生死鎖,然後檢測死鎖。
    • 解除死鎖:當檢測到死鎖的時候,採取相應措施,將程序從死鎖狀態中解脫出來。

6. 預防死鎖

由於互斥條件是非共享裝置所必須的,不僅不能改變,還應加以保證。因此主要是破壞其他三個條件。

  • 破壞請求和保持條件:比較現實
  • 破壞不可搶佔條件:會延長程序的週轉時間,增加了系統開銷,降低了系統吞吐量。
  • 破壞迴圈等待條件:對所有資源型別進行線性排序。

7. 避免死鎖

  • 安全狀態一定不會有死鎖發生。
  • 不安全狀態不一定有死鎖發生。
  • 銀行家演算法

8. 死鎖的檢測與解除

  • 死鎖的檢測
    • 資源分配圖
    • 死鎖定理:在資源分佈圖中,找出一個既不阻塞由非獨立的程序節點讓其執行。最終S為死鎖的充分條件是:當且僅當S狀態的資源分配圖是不可完全簡化的。
  • 死鎖解除
    • 搶佔資源。
    • 終止程序。