一、什么是死鎖
死鎖是指多個進程因競爭資源而造成的一種僵局(互相等待),若無外力作用,這些進程都將無法向前推進。例如,在某一個計算機系統中只有一台打印機和一台輸入 設備,進程P1正占用輸入設備,同時又提出使用打印機的請求,但此時打印機正被進程P2 所占用,而P2在未釋放打印機之前,又提出請求使用正被P1占用着的輸入設備。這樣兩個進程相互無休止地等待下去,均無法繼續執行,此時兩個進程陷入死鎖狀態。
二、死鎖產生的原因
1. 系統資源的競爭
系統資源的競爭導致系統資源不足,以及資源分配不當,導致死鎖。
2. 進程運行推進順序不合適
進程在運行過程中,請求和釋放資源的順序不當,會導致死鎖。
三、死鎖的四個必要條件
互斥條件:一個資源每次只能被一個進程使用,即在一段時間內某 資源僅為一個進程所占有。此時若有其他進程請求該資源,則請求進程只能等待。
請求與保持條件:進程已經保持了至少一個資源,但又提出了新的資源請求,而該資源 已被其他進程占有,此時請求進程被阻塞,但對自己已獲得的資源保持不放。
不可剝奪條件:進程所獲得的資源在未使用完畢之前,不能被其他進程強行奪走,即只能 由獲得該資源的進程自己來釋放(只能是主動釋放)。
循環等待條件: 若干進程間形成首尾相接循環等待資源的關系
這四個條件是死鎖的必要條件,只要系統發生死鎖,這些條件必然成立,而只要上述條件之一不滿足,就不會發生死鎖。
四、 死鎖的避免與預防
1. 死鎖避免
死鎖避免的基本思想:系統對進程發出的每一個系統能夠滿足的資源申請進行動態檢查,並根據檢查結果決定是否分配資源,如果分配后系統可能發生死鎖,則不予分配,否則予以分配,這是一種保證系統不進入死鎖狀態的動態策略。
如果操作系統能保證所有進程在有限時間內得到需要的全部資源,則系統處於安全狀態否則系統是不安全的。
- 安全狀態是指:如果系統存在 由所有的安全序列{P1,P2,…Pn},則系統處於安全狀態。一個進程序列是安全的,如果對其中每一個進程Pi(i >=1 && i <= n)他以后尚需要的資源不超過系統當前剩余資源量與所有進程Pj(j < i)當前占有資源量之和,系統處於安全狀態則不會發生死鎖。
- 不安全狀態:如果不存在任何一個安全序列,則系統處於不安全狀態。他們之間的對對應關系如下圖所示:
下面我們來通過一個例子對安全狀態和不安全狀態進行更深的了解
如上圖所示系統處於安全狀態,系統剩余3個資源,可以把其中的2個分配給P3,此時P3已經獲得了所有的資源,執行完畢后還能還給系統4個資源,此時系統剩余5個資源所以滿足(P2所需的資源不超過系統當前剩余量與P3當前占有資源量之和),同理P1也可以在P2執行完畢后獲得自己需要的資源。
如果P1提出再申請一個資源的要求,系統從剩余的資源中分配一個給進程P1,此時系統剩余2個資源,新的狀態圖如下:那么是否仍是安全序列呢那我們來分析一下
系統當前剩余2個資源,分配給P3后P3執行完畢還給系統4個資源,但是P2需要5個資源,P1需要6個資源,他們都無法獲得資源執行完成,因此找不到一個安全序列。此時系統轉到了不安全狀態。
2. 死鎖預防
我們可以通過破壞死鎖產生的4個必要條件來 預防死鎖,由於資源互斥是資源使用的固有特性是無法改變的。
- 破壞“不可剝奪”條件:一個進程不能獲得所需要的全部資源時便處於等待狀態,等待期間他占有的資源將被隱式的釋放重新加入到 系統的資源列表中,可以被其他的進程使用,而等待的進程只有重新獲得自己原有的資源以及新申請的資源才可以重新啟動,執行。
- 破壞”請求與保持條件“:第一種方法靜態分配即每個進程在開始執行時就申請他所需要的全部資源。第二種是動態分配即每個進程在申請所需要的資源時他本身不占用系統資源。
- 破壞“循環等待”條件:采用資源有序分配其基本思想是將系統中的所有資源順序編號,將緊缺的,稀少的采用較大的編號,在申請資源時必須按照編號的順序進行,一個進程只有獲得較小編號的進程才能申請較大編號的進程。