操作系統0x07-死鎖

2.4.1 死鎖的基本概念

死鎖的定義

      多個進程因競爭資源而造成的一種僵局,若無外力作用,這些進程都無法向前推進。

死鎖產生的原因

(1)系統資源的競爭
      只有對不可剝奪資源的競爭纔可能產生死鎖,對可剝奪資源的競爭是不會引起死鎖的。
(2)進程推進順序非法
      進程在運行過程中,請求和釋放資源的順序不當,同樣會導致死鎖。信號量使用不當也會造成死鎖。
(3)死鎖產生的必要條件
      產生死鎖必須同時滿足以下4個條件,只要其中任意一個不成立,死鎖都不會發生。

  • 互斥條件:在一段時間內某資源僅爲一個進程所佔有。
  • 不剝奪條件:進程只能主動釋放獲得的資源。
  • 請求並保持條件:進程已經保持了至少一個資源,但又提出了新的資源請求,而該資源已被其他進程佔有,此時請求進程被阻塞,但對自己已獲得資源保持不放。
  • 循環等待條件:存在一種進程資源的循環等待鏈,鏈中每個進程已獲得的資源同時被鏈中下一個進程所請求。

2.4.2 死鎖的處理策略

(1)死鎖預防
      設置某些限制條件,破壞產生死鎖的四個必要條件中的一個或幾個,以防止發生死鎖。
(2)避免死鎖
      在資源的動態分配過程中,用某種方法防止系統進入不安全狀態,從而避免死鎖。
(3)死鎖的檢測及解除
      無需採取任何限制性措施,允許進程在運行過程中發生死鎖,通過系統的檢測機構及時的檢測出死鎖的發生,然後採取某種措施解除死鎖。

2.4.3 死鎖預防

破壞四個必要條件之一即可。

死鎖產生的必要條件 破壞手段
互斥條件 若允許系統資源都能共享使用,則系統不會進入死鎖狀態。但有些資源根本不能同時訪問,所以這種方法不大可行,而且在有的場合應該保持這種互斥性。
不剝奪條件 當一個以保持了某些不可剝奪資源的進程請求新的資源而得不到滿足時,他必須釋放已經保持了所有資源,以後需要時再重新申請。常用易於保存和恢復的資源,如CPU的寄存器及內存資源,一般不能用於打印機之類的資源。
請求並保持條件 採用預先靜態分配方法的進程在運行前一次申請完它所需要的全部資源,在他的資源未滿足前,不把它投入運行,一旦投入運行,這些資源就一直歸他所有,不再提出其他資源請求。
循環等待條件 採用順序資源分配法,首先給系統中的資源編號,規定每個進程必須按編號遞增的順序申請資源,同類資源一次申請完。

2.4.4 死鎖避免

系統安全狀態

      系統在進行資源分配之前,應先計算計算此次分配資源的安全性,若此次分配不會導致系統進入不安全狀態,則將系統資源分配給進程,否則讓進程等待。
      安全狀態是指系統能按某種進程推進順序P1,P2,…,Pn爲每個進程分配起所需的資源。直至滿足每個進程對資源的最大需求,使每個進程都可順序完成。此時稱P1,P2,…,Pn安全系列。若系統無法找到一個安全序列,則稱系統處於不安全狀態。
      安全狀態一定是沒有死鎖發生。不安全狀態不一定導致死鎖。

銀行家算法

      在銀行中,客戶申請貸款的數量是有限的,每個客戶在第一次申請貸款時要聲明完成該項目所需的最大資金量,在滿足所有貸款要求時,客戶應及時歸還。銀行家在客戶申請的貸款數量不超過自己擁有的最大值時,都應儘量滿足客戶的需要。在這樣的描述中,銀行家就好比操作系統,資金就是資源,客戶就相當於要申請資源的進程。
      銀行家算法是一種最有代表性的避免死鎖的算法。在避免死鎖方法中允許進程動態地申請資源,但系統在進行資源分配之前,應先計算此次分配資源的安全性,若分配不會導致系統進入不安全狀態,則分配,否則等待。爲實現銀行家算法,系統必須設置若干數據結構。
例、假設系統有5個進程{P0,P1,P2,P3,P4},3類資源{A,B,C},各類資源的數量分別爲10,5,7。在T0時刻的資源分配情況如下表:

進程 共需資源
A      B      C
已分配資源
A      B      C
還需要資源
A      B      C
P0 7      5      3 0      1      0 7      4      3
P1 3      2      2 2      0      0 1      2      2
P2 9      0      2 3      0      2 6      0      0
P3 2      2      2 2      1      1 0      1      1
P4 4      3      3 0      0      2 4      3      1

      此時系統還剩餘資源爲3,3,2。將系統剩餘資源量分別與“還需要資源”的各行進行比較。如(3,3,2)>(1,2,2), (3,3,2)>(0,1,1),對應的兩個進程爲P1和P3,可選擇P1(也可以選擇P3)暫時加入安全序列。
      執行完P1後,釋放其所佔資源,此時系統還剩餘資源爲(3,3,2)+(2,0,0)=(5,3,2)。繼續將(5,2,2)和“還需要資源”的各行進行比較,重複上述步驟,最後可以得到安全序列{P1,P3,P4,P2,P0}。

2.4.5 死鎖檢測和解除

資源分配圖

在這裏插入圖片描述
上圖表示,進程P1已得到了2個R1資源,正在請求1個R2資源;進程P2得到了1個R1和1個R2資源,並又請求1個R1資源。

死鎖定理

      狀態爲死鎖的條件是:當且僅當狀態的資源分配圖是不可簡化的。(簡化:若連接到進程上的所有邊,其對應的資源的申請數量都小等於系統中共有的資源數量,則可以將該進程上的所有邊消去。)

死鎖解除

  • 資源剝奪法:掛起某些死鎖進程,搶佔它的資源並分配給其他進程。
  • 撤銷進程法:強制撤銷部分甚至全部死鎖進程並剝奪這些進程的資源。
  • 進程回退法:讓一個或多個進程回退到足以迴避死鎖的地步,進程回退時自願釋放資源而非被剝奪。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章