什么是死鎖?死鎖發生的四個必要條件是什么?如何避免和預防死鎖產生?


什么是死鎖?

  死鎖是指兩個或兩個以上的進程在執行過程中,由於競爭資源或者由於彼此通信而造成的一種阻塞的現象,若無外力作用,它們都將無法推進下去。此時稱系統處於死鎖狀態或系統產生了死鎖,這些永遠在互相等待的進程稱為死鎖進程。

  例如,在某個計算機系統中只有一台打印機和一台輸入 設備,進程P1正占用輸入設備,同時又提出使用打印機的請求,但此時打印機正被進程P2 所占用,而P2在未釋放打印機之前,又提出請求使用正被P1占用着的輸入設備。這樣兩個進程相互無休止地等待下去,均無法繼續執行,此時兩個進程陷入死鎖狀態。

 

死鎖產生的原因:

1.系統資源的競爭

  當系統中供多個進程共享的資源如打印機、公用隊列的等,其數目不足以滿足諸進程的需要時,會引起諸進程對資源的競爭而產生死鎖。

2.進程運行推進順序不當引起死鎖

  ● 進程推進順序合法
  當進程P1和P2並發執行時,如果按照下述順序推進:P1:Request(R1); P1:Request(R2); P1: Relese(R1);P1: Relese(R2); P2:Request(R2); P2:Request(R1); P2: Relese(R2);P2: Relese(R1);這兩個進程便可順利完成,這種不會引起進程死鎖的推進順序是合法的。
  ● 進程推進順序非法
  若P1保持了資源R1,P2保持了資源R2,系統處於不安全狀態,因為這兩個進程再向前推進,便可能發生死鎖。例如,當P1運行到P1:Request(R2)時,將因R2已被P2占用而阻塞;當P2運行到P2:Request(R1)時,也將因R1已被P1占用而阻塞,於是發生進程死鎖。
 

產生死鎖的四個必要條件:

  ● 互斥條件:指進程對所分配到的資源進行排它性使用,即在一段時間內某資源只由一個進程占用。如果此時還有其它進程請求資源,則請求者只能等待,直至占有資源的進程用畢釋放。

  ● 請求與保持條件:進程已經保持了至少一個資源,但又提出了新的資源請求,而該資源 已被其他進程占有,此時請求進程被阻塞,但對自己已獲得的資源保持不放。

  ● 不可剝奪條件:進程所獲得的資源在未使用完畢之前,不能被其他進程強行奪走,即只能 由獲得該資源的進程自己來釋放(只能是主動釋放)。

  ● 循環等待條件:指在發生死鎖時,必然存在一個進程——資源的環形鏈,即進程集合{P0,P1,P2,···,Pn}中的P0正在等待一個P1占用的資源;P1正在等待P2占用的資源,……,Pn正在等待已被P0占用的資源。

  這四個條件是死鎖的必要條件,只要系統發生死鎖,這些條件必然成立,而只要上述條件之一不滿足,就不會發生死鎖。

 

死鎖的避免與預防

死鎖避免的基本思想:系統對進程發出每一個系統能夠滿足的資源申請進行動態檢查,並根據檢查結果決定是否分配資源,如果分配后系統可能發生死鎖,則不予分配,否則予以分配。這是一種保證系統不進入死鎖狀態的動態策略。

  理解了死鎖的原因,尤其是產生死鎖的四個必要條件,就可以最大可能地避免、預防和解除死鎖。只要打破四個必要條件之一就能有效預防死鎖的發生:

  ● 打破互斥條件:改造獨占性資源為虛擬資源,大部分資源已無法改造。

  ● 打破不可搶占條件:當一進程占有一獨占性資源后又申請一獨占性資源而無法滿足,則退出原占有的資源。

  ● 打破占有且申請條件:采用資源預先分配策略,即進程運行前申請全部資源,滿足則運行,不然就等待,這樣就不會占有且申請。

  ● 打破循環等待條件:實現資源有序分配策略,對所有設備實現分類編號,所有進程只能采用按序號遞增的形式申請資源。

 

死鎖避免和死鎖預防的區別

  死鎖預防是設法至少破壞產生死鎖的四個必要條件之一,嚴格的防止死鎖的出現;而死鎖避免則不那么嚴格的限制產生死鎖的必要條件的存在,因為即使死鎖的必要條件存在,也不一定發生死鎖。死鎖避免是在系統運行過程中注意避免死鎖的最終發生。

 

 

實例演示

下面通過一個例子對安全狀態和不安全狀態進行更深的了解 :
  

  如上圖所示系統處於安全狀態,系統剩余3個資源,可以把其中的2個分配給P3,此時P3已經獲得了所有的資源,執行完畢后還能還給系統4個資源,此時系統剩余5個資源所以滿足(P2所需的資源不超過系統當前剩余量與P3當前占有資源量之和),同理P1也可以在P2執行完畢后獲得自己需要的資源。 
  如果P1提出再申請一個資源的要求,系統從剩余的資源中分配一個給進程P1,此時系統剩余2個資源,新的狀態圖如下:那么是否仍是安全序列呢那我們來分析一下 
  

  系統當前剩余2個資源,分配給P3后P3執行完畢還給系統4個資源,但是P2需要5個資源,P1需要6個資源,他們都無法獲得資源執行完成,因此找不到一個安全序列。此時系統轉到了不安全狀態。

 


免責聲明!

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



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