死鎖

操作系統中有若干進程併發執行,它們不斷申請、使用、釋放系統資源,雖然系統的進
程協調、通信機構會對它們進行控制,但也可能出現若干進程都相互等待對方釋放資源才能
繼續運行,否則就阻塞的情況。此時,若不借助外界因素,誰也不能釋放資源,誰也不能解
除阻塞狀態。根據這樣的情況,操作系統中的死鎖被定義爲系統中兩個或者多個進程無限期
地等待永遠不會發生的條件,系統處於停滯狀態,這就是死鎖。
死鎖:是指兩個或兩個以上的進程在執行過程中,因爭奪資源而造成的一種互相等待的現象,若無外力作用,它們都將無法推進下去。

產生死鎖的原因主要是:
(1) 因爲系統資源不足。
(2) 進程運行推進的順序不合適。
(3) 資源分配不當等。
如果系統資源充足,進程的資源請求都能夠得到滿足,死鎖出現的可能性就很低,否則
就會因爭奪有限的資源而陷入死鎖。其次,進程運行推進順序與速度不同,也可能產生死鎖。

產生死鎖的四個必要條件:
(1) 互斥條件:一個資源每次只能被一個進程使用。
(2) 佔有且等待:一個進程因請求資源而阻塞時,對已獲得的資源保持不放。
(3)不可強行佔有:進程已獲得的資源,在末使用完之前,不能強行剝奪。
(4) 循環等待條件:若干進程之間形成一種頭尾相接的循環等待資源關係。
這四個條件是死鎖的必要條件,只要系統發生死鎖,這些條件必然成立,而只要上述條件之
一不滿足,就不會發生死鎖。
死鎖的解除與預防:
理解了死鎖的原因,尤其是產生死鎖的四個必要條件,就可以最大可能地避免、預防和
解除死鎖。所以,在系統設計、進程調度等方面注意如何不讓這四個必要條件成立,如何確
定資源的合理分配算法,避免進程永久佔據系統資源。此外,也要防止進程在處於等待狀態
的情況下佔用資源。因此,對資源的分配要給予合理的規劃

處理死鎖的基本方法:
*死鎖預防:通過設置某些限制條件,去破壞死鎖的四個條件中的一個或幾個條件,來預防發生死鎖。但由於所施加的限制條件往往太嚴格,因而導致系統資源利用率和系統吞吐量降低。
*死鎖避免:允許前三個必要條件,但通過明智的選擇,確保永遠不會到達死鎖點,因此死鎖避免比死鎖預防允許更多的併發。
*死鎖檢測:不須實現採取任何限制性措施,而是允許系統在運行過程發生死鎖,但可通過系統設置的檢測機構及時檢測出死鎖的發生,並精確地確定於死鎖相關的進程和資源,然後採取適當的措施,從系統中將已發生的死鎖清除掉。
*死鎖解除:與死鎖檢測相配套的一種措施。當檢測到系統中已發生死鎖,需將進程從死鎖狀態中解脫出來。常用方法:撤銷或掛起一些進程,以便回收一些資源,再將這些資源分配給已處於阻塞狀態的進程。死鎖檢測盒解除有可能使系統獲得較好的資源利用率和吞吐量,但在實現上難度也最大。

二 死鎖預防:破壞死鎖的四個條件中的一個或幾個。
(1)互斥:它是設備的固有屬性所決定的,不僅不能改變,還應該加以保證。
(2)佔有且等待:
爲預防佔有且等待條件,可以要求進程一次性的請求所有需要的資源,並且阻塞這個進程直到所有請求都同時滿足。這個方法比較低效。
(3)不可搶佔:
預防這個條件的方法:
*如果佔有某些資源的一個進程進行進一步資源請求時被拒絕,則該進程必須釋放它最初佔有的資源。
*如果一個進程請求當前被另一個進程佔有的一個資源,則操作系統可以搶佔另外一個進程,要求它釋放資源。
(4)循環等待:通過定義資源類型的線性順序來預防。
*如果一個進程已經分配了R類資源,那麼接下來請求的資源只能是那些排在R類型之後的資源類型。該方法比較低效。

三 死鎖避免:
(1)兩種死鎖避免算法:
*進程啓動拒絕:如果一個進程的請求會導致死鎖,則不啓動該進程。
*資源分配拒絕:如果一個進程增加的資源請求會導致死鎖,則不允許此分配(銀行家算法)。

(2)銀行家算法:
1.如果request<=need,轉向步驟2;否則認爲出錯,因爲請求資源大於需要資源。
2.如果request<=available,轉向步驟3,;否則尚無足夠資源,進程p阻塞;
3.系統嘗試爲把資源分配給進程P,並修改available、allocation和need的數值。
4.系統執行安全性算法,檢查此次分配後系統是否處於安全狀態,若安全,才正式將資源分配給進程P,否則將本次試探性分配作廢,讓進程P等待。
*安全狀態:系統能按照某種進程順序,爲每個進程分配資源,直至滿足每個進程對資源的最大需求,使每個進程都可順利完成。

(3)安全性算法:
1.設置兩個向量:
*工作向量work:表示系統可提供給進程繼續運行的所需的各類資源的數目,執行安全算法開始時,work=available。
*finish:表示系統是否有足夠資源分配給進程,使之運行完成。開始時先做finish[i]=false;當有足夠資源分配給進程時再令finish[i]=true。
2.從進程集合找到一個滿足下列條件的進程:
*finish[i]=false;
*need<=work;
*若找到執行步驟3;否則執行步驟4;
3.當進程P獲得資源後,可順利執行,直至完成,並釋放出分配給它的資源,故應執行:
*work=work+allocation(P);
*finish[i]=true;
*循環執行步驟2;
4.如果所有進程的finish=true,則表示系統處於安全狀態;否則,系統處於不安全狀態。

四 死鎖檢測和解除
(1)死鎖檢測算法。
(2)死鎖的解除:
*兩種常用的死鎖解除方法:剝奪資源和撤銷進程。

發佈了28 篇原創文章 · 獲贊 17 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章