什麼是鎖,死鎖發生的必要條件,鎖避免的方式

2021-09-24 11:00:46 字數 2799 閱讀 4670

**:

什麼是死鎖?

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

例如,在某個計算機系統中只有一台印表機和一台輸入 裝置,程序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占用的資源;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個資源,他們都無法獲得資源執行完成,因此找不到乙個安全序列。此時系統轉到了不安全狀態。

悲觀鎖與樂觀鎖

執行緒的5種狀態

死鎖的必要條件

假設死鎖是由於程序競爭資源而引起的,我們下面給出死鎖發生的四個必要條件,這四個條件是 coffman首先提出的,所以也稱為coffman條件 1 資源獨佔 mutual exclusion 乙個資源在同一時刻只能分配給乙個程序.如果某一程序申請某一資源,而該資源正被另外某一程序所占有,則申請者需等待...

執行緒死鎖和死鎖的必要條件

如果乙個程序集合裡面的每個程序都在等待這個集合中的其他乙個程序 包括自身 才能繼續往下執行,若無外力他們將無法推進,這種情況就是死鎖,處於死鎖狀態的程序稱為死鎖程序 產生死鎖的四個必要條件?1 互斥條件 程序對所分配到的資源不允許其他程序進行訪問,若其他程序訪問該資源,只能等待,直至占有該資源的程序...

死鎖的4個必要條件

1.互斥條件 2.非搶占條件 3.占有並等待條件 4.迴圈等待條件 以下正解 發生死鎖的必要條件有四點 互斥條件 不可搶占條件 部分分配條件和迴圈等待條件。互斥條件 系統中存在乙個資源一次只能被乙個程序所使用 非搶占條件 系統中存在乙個資源僅能被占有它的程序所釋放,而不能被別的程序強行搶占。占有並等...