操作系統學習筆記(6)——進程死鎖




1、進程死鎖的概念與條件

  • 死鎖定義
    • 背景:多道進程的並發執行改善系統的資源利用率,但也可能進程相互等待對方釋放資源才能繼續運行。
    • 死鎖:指兩個或兩個以上的進程在執行過程中,由於競爭資源或者由於彼此通信而造成的一種阻塞的現象,若無外力作用,它們都將無法推進下去。此時稱系統處於死鎖狀態或系統產生了死鎖,這些永遠在互相等待的進程稱為死鎖進程。
  • 死鎖場景
    • 申請同類資源
      • 內存資源有m個分配單位
      • n個進程共享內存資源
      • 進程每次只能申請一個單位
      • 滿足總理才能使用
      • 每個進程使用玩一次性釋放
    • 申請不同類資源
  • 死鎖條件
    • 互斥使用(資源獨占):指進程對所分配到的資源進行排它性使用,即在一段時間內某資源只由一個進程占用。如果此時還有其它進程請求資源,則請求者只能等待,直至占有資源的進程用畢釋放
    • 不可強占(不可剝奪):指進程已獲得的資源,在未使用完之前,不能被剝奪,只能在使用完時由自己釋放
    • 請求保持(部分分配,占有申請)︰指進程已經保持至少一個資源,但又提出了新的資源請求,而該資源已被其它進程占有,此時請求進程阻塞,但又對自己已獲得的其它資源保持不放
    • 環路等待:指在發生死鎖時,必然存在一個進程——資源的環形鏈,即進程集合{P0,P1,P2,···,Pn}中的P0正在等待一個P1占用的資源;P1正在等待P2占用的資源,……,Pn正在等待已被P0占用的資源

    



 

2、預防機制

  • 原理
    •  預先確定資源分配,保證不發生死鎖
    • 通過破壞死鎖4個必要條件之一來實現
    • 破壞“互斥使用”這一必要條件不現實
  • 解決方案
    • 破壞“不可剝奪”
      • 允許進程動態申請資源
      • 進程在申請新資源不能得到滿足而變為等待狀態之前,必須釋放已占有的資源
      • 若需要資源必須重新申請
    • 破壞“請求保持”
      • 不允許進程動態申請資源
      • 進程運行前須一次性申請所需的所有資源
      • 進程所要資源均可滿足時給予一次性分配
    • 破壞“循環等待”
      • 采用資源有序分配法
      • 系統中所有資源編號
      • 進程須嚴格按資源編號的遞增次序申請資源
      • 違反上述規則操作系統不予分配

      



3、避免機制

  • 原理
    • 對進程發出的每一個資源申請進行動態檢查
    • 根據檢查結果決定是否分配資源
    • 若試分配后可能發生死鎖,則不予分配,否則分配
  • 銀行家算法
    • 概覽:Dijkstra在1965年提出的銀行家算法是著名的死鎖避免算法,這個用於一個銀行家給多個顧客貸款的算法可以直接用於操作系統給進程分配資源,這時只要把銀行家換成操作系統,把顧客換成進程,把資金換成資源,把銀行家決定是否放貸時所用的判斷過程(即判斷顧客是否有信譽和償還能力)換成操作系統決定是否分配資源時所用的判斷過程(即判斷進程是否能及時歸還資源)即可。
    • 問題描述:銀行家擁有一筆周轉資金。客戶要求分期貸款,如果能夠得到各期貸款,就—定能夠歸還貸款,否則就一定不能歸還貸款。銀行家應謹慎地貸款,防止出現壞賬。銀行家采用的具體方法是看是否有足夠的剩余資金滿足某一客戶,如此反復下去。如果所有投資最終都被收回,則請求可以批准。
    • 問題轉譯:若在某一時刻,系統能按某種進程順序,如{P1,P2,…,Pn},為每個進程分配其所需的資源,直至最大需求,使每個進程均可順利完成,則稱此時系統的狀態為安全狀態,稱這樣的一個進程序列{P1,P2,…,Pn},為安全序列。安全序列的實質是:序列中的每一個進程Pi( i= 1,2,… ,n)到運行完成尚需的資源量不超過系統當前剩余的資源量與所有在序列中排在它前面的進程當前所占有的資源量之和。若在某一時刻,系統中不存在一個安全序列,則稱系統處於不安全狀態
    • 需注意:(1)系統在某一時刻的安全狀態可能不唯一,但這不影響對系統安全性的判斷。(2)安全狀態是非死鎖狀態,而不安全狀態並不一定是死鎖狀態。即系統處於安全狀態一定可以避免死鎖,而系統處於不安全狀態則僅僅可能進入死鎖狀態。

 

    • 銀行家算法的實質就是要設法保證系統動態分配資源后不進入不安全狀態,以避免可能產生的死鎖。即沒當進程提出資源請求且系統的資源能夠滿足該請求時,系統將判斷滿足此次資源請求后系統狀態是否安全,如果判斷結果為安全,則給該進程分配資源,否則不分配資源,申請資源的進程將阻塞。
    • 相關數據結構:
      • 可利用資源向量Available。這是一個含有m個元素的數組,其中的而每一個元素代表一類可利用資源數目,其初始值是系統中所配置的該類全部可用資源的數目,其數值隨該類資源的分配和回收而動態的改變。如果Available[j]=K,則表示系統中現有Rj類資源K個。
      •  最大需求矩陣Max。這是一個n*m的矩陣,它定義了系統中n個進程中的每一個進程對m類資源的最大需求。如果Max[i,j]=K;則表示進程i需要Rj類資源的最大數目為K。
      • 分配矩陣Allocation。這也是一個n*m的矩陣,它定義了系統中每一類資源當前已分配給每一進程的資源數。如果Allocation[i,j]=K,則表示進程i當前已分得Rj類資源的數目為K。
      • 需求矩陣Need。這也是一個n*m的矩陣,用以表示每一個進程尚需的各類資源數。如果Need[i,j]=K,則表示進程i還需要Rj類資源K個,方能完成任務。
      • 三者關系:Need[i,j]=Max[i,j]-Allocation[i,j] 
    • 設計思路:
      • 第一部分:銀行家算法模塊:
        • 1.如果Request<=Need,則轉向2;否則,出錯。
        • 2.如果Request<=Available,則轉向3,否則等待 。
        • 3.系統試探分配請求的資源給進程。
        • 4.系統執行安全性算法。
      • 第二部分:安全性算法模塊:
        • (1)設置兩個向量  
          • ①工作向量:Work=Available(表示系統可提供給進程繼續運行所需要的各類資源數目)  
          • ②Finish:表示系統是否有足夠資源分配給進程(True:有;False:沒有).初始化為False 
        • (2)若Finish[i]=False&&Need<=Work,則執行3;否則執行4(i為資源類別) 
        • (3). 進程P獲得第i類資源,則順利執行直至完成,並釋放資源: Work=Work+Allocation; Finish[i]=true;轉2 
        • (4)若所有進程的Finish[i]=true,則表示系統安全;否則,不安全!
    • 詳細設計:
      • 在系統運行過程中,對進程發出的每一個系統能夠滿足的資源申請進行動態檢查,並根據檢查結果決定是否分配資源,若分配后系統可能發生死鎖,則不予分配,否則予以分配 。因此,對資源的分配要給予合理的規划。
      • 設Request i是進程Pi的申請向量,如果Request i[j]=K,則表示進程Pi需要K個Rj類型的資源。當Pi發出資源請求后,系統按下述步驟進行檢查:
        1. 如果Request i[j]<=Need[i,j],便轉向步驟2);否則認為出錯,因為它所需要的資源數已經超過它所宣布的最大值。
        2. 如果Request i[j]<=Available[i,j],便轉向步驟3);否則,表示尚無足夠資源,Pi需等待。
        3. 系統試探着把資源分配給進程Pi,並修改下面數據結構中的數值:
          • Available[j]:=Available[j]-Request i[j];
          • Allocation[i,j]:=Allocation[i,j]+Request i[j];
          • Need[i,j]:=Need[i,j]-Request i[j
        4. 系統執行安全性算法,檢查此次資源分配后系統是否處於安全狀態。若安全,才正式將資源分配給進程Pi,以完成本次分配;否則,將本次的試探分配作廢,恢復原來的資源分配狀態,讓進程Pi等待。
    • 系統所執行的安全性算法可描述
      1. 設置兩個向量
        • 工作向量Work,它表示系統可提供給進程繼續運行所需的各類資源數目,它含有m個元素,在執行安全算法開始時,Work:=Available。
        • Finish,它表示系統是否有足夠的資源分配給進程,使之運行完成。開始時先做Finish[i]:=false;當有足夠資源分配給進程時,再令Finish[i]:=ture.
      2. 從進程集合中找到一個滿足下述條件的進程:
        • Finish[i]=false;
        • Need[i,j]<=Work[j];若找不到,執行步驟3),否則,執行步驟4)。
      3. 當進程Pi獲得資源后,可順利執行,直至完成,並釋放出分配給它的資源,故應執行:
        • Work[j]:=Work[j]+Allocation[i,j];
        •  Finish[i]:=true;
        • Go to step 2;
      4. 如果所有進程的Finish[i]=true都滿足,則表示系統處於安全狀態;否則,系統處於不安全狀態。

 

    • eg1.
      • 假定系統中有五個進程{p0,p1,p2,p3,p4}和三類資源{A,B,C}各類資源的數目分別是10,5,7,已知T0時刻資源分配情況如下: 

  

 

      • 如上圖所示是我們的已知條件也就是我們開始時候的資源分配狀態,接下來我們要求這個狀態下的安全序列,也就是將可利用的資源分配給某個需要資源小於可利用資源的進程,讓這個進程運行完成,進程運行完成之后已分配的資源就會被釋放,然后繼續執行上述操作,只要能找到滿足Need小於Available,就分配資源,讓該進程運行完成,最后將資源釋放,也就是將已分配的資源加到可利用的資源,如果最后每一個進程都能運行完成就得到了我們的安全序列,所以系統就是安全的,如果存在一個進程,可利用資源不能滿足需求就不再分配
      • 過程:
        • 將Available和Need對比,P0的Need>Available,不滿足,往后找, 
        • P1的Available小於Need,分配給P1,P1就能運行完成,最后釋放資源{2,0,0} ,所以現在的資源就是{3,3,2}+{2,0,0}={5,3,2} 
        • 然后繼續向下找,p2不滿足條件,P3滿足條件,將資源分配給P3,讓其運行完成,並釋放空間{2,1,1},所以現在的資源就是{5,3,2}+{2,1,1}={7,4,3}
        • 依次類推得到安全序列為{P1,P3,P4,P2,P0} 
      • 過程如下圖,其中finish表示進程運行完成 

 

    • eg2.
      • 假設P1請求資源Request{1,0,2},要怎樣處理呢 ?首先要檢測看請求資源是不是比可利用資源和需要資源小,如果其中一個或兩個條件都不滿足,進程等待,如果滿足進行下面操作, 這里{1,0,2}是滿足這兩個條件的 。我們進行的操作就是將請求資源加到Allocation上面,也就是已分配的資源得到擴充,同樣的請求的資源一定是來自可利用資源的,所以可利用資源要減上一個請求資源數目,因為Need和Allocation的和是一個固定值max所以相應的Allocation加上一個數值,Need就要減上一個數值,變化之后如下圖所示: 

 

      • 然后再像前面一樣,把這個表當成T0時刻的資源分配狀態,再來找安全序列,判斷系統是不是安全的。


4、檢測和解決

  • 原理
    • 允許死鎖發生
    • 系統不斷監視進展情況,判斷死鎖是否發生

    • 一旦死鎖發生則采取專門的措施,解除死鎖並以最小的代價恢復運行

    • 檢測時機:定時檢測、進程等待、資源利用率下降
    • 檢測手段:進程-資源分配圖
  • 死鎖檢測
    • 檢測模型

      • 方框表示資源類
      • 黑圓點表示資源實例
      • 圓圈中加進程名表示進程
      • 資源實例指向進程的一條有向邊來表示分配邊
      • 進程指向資源類的一條有向邊來表示申請邊
      • 檢測“進程-資源分配圖”是否可完全簡化
    • 檢測步驟
      • ①找一個只有分配邊的非孤立進程結點,去掉分配邊將其變為孤立結點;若找不到則轉③
      • ②將資源分配給一個等待資源的進程,將某進程的申請邊變為分配邊,轉①
      • ③圖中有進程不是孤立結點,則此圖不可完全簡化,滿足死鎖的充分條件,系統為死鎖狀態

    • 死鎖解除
      • 資源剝奪法
        • 從其他進程那里剝奪足夠數量的資源給死鎖進程,以解除死鎖狀態
      • 撤銷進程法
        • 撤消全部死鎖進程,恢復到正常狀態,簡單但代價太大
        • 按照某種順序逐個撤消死鎖進程,直到有足夠的資源供其他未被撤消的進程使用,以消除死鎖狀態

          



 

5、對死鎖的思考

  • 原因
    • 系統資源不足
    • 進程運行推進的順序不合適
    • 資源分配不當
  • 解決原則
    • 單獨使用死鎖預防、避免、檢測與解除並不能全面解決操作系統中遇到的所有死鎖問題
    • 可將系統中的進程、資源分為若干類,對每一類進程、資源使用最適合它的辦法解決死鎖


 

 

 


免責聲明!

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



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