1. 程式人生 > >互斥與死鎖

互斥與死鎖

死鎖

定義 :在一個程序集合中,所有的程序都在等待只能由該程序集合中的其它程序才能引發的事件,這就是死鎖解釋 :由於程序集合中的所有程序都在等待集合中的其它程序引發喚醒該程序的事件,所以所有程序都會阻塞而無法向前推進。一般大多數的等待事件都是釋放程序集合中其它程序所佔有的資源,也叫資源死鎖。資源死鎖的四大必須條件 1>互斥條件:即某個資源在一段時間內只能由一個程序佔有,不能同時被兩個或以上的程序佔有2>請求與保持:程序至少已經佔有一個資源,但又申請新的資源;由於該資源已被另外程序佔有,此時該程序阻塞;但是,它在等待新資源之時,仍繼續佔用已佔有的資源3>不可搶佔條件:程序所獲得的資源在未使用完畢之前,資源申請者不能強行地從資源佔有者手中奪取資源,而只能由該資源的佔有者程序自行釋放
4>環路等待:存在一個程序等待序列{P1,P2,...,Pn},其中P1等待P2所佔有的某一資源,P2等待P3所佔有的某一源,......,而Pn等待P1所佔有的的某一資源,形成一個程序迴圈等待環

死鎖預防

防止死鎖的發生只需破壞死鎖產生的四個必要條件之一即可。

1) 破壞互斥條件

如果允許系統資源都能共享使用,則系統不會進入死鎖狀態。但有些資源根本不能同時訪問,如印表機等臨界資源只能互斥使用。所以,破壞互斥條件而預防死鎖的方法不太可行,而且在有的場合應該保護這種互斥性。

2) 破壞不剝奪條件

當一個已保持了某些不可剝奪資源的程序,請求新的資源而得不到滿足時,它必須釋放已經保持的所有資源,待以後需要時再重新申請。這意味著,一個程序已佔有的資源會被暫時釋放,或者說是被剝奪了,或從而破壞了不可剝奪條件。
該策略實現起來比較複雜,釋放已獲得的資源可能造成前一階段工作的失效,反覆地申請和釋放資源會增加系統開銷,降低系統吞吐量。這種方法常用於狀態易於儲存和恢復的資源,如CPU的暫存器及記憶體資源,一般不能用於印表機之類的資源。

3) 破壞請求和保持條件

釆用預先靜態分配方法,即程序在執行前一次申請完它所需要的全部資源,在它的資源未滿足前,不把它投入執行。一旦投入執行後,這些資源就一直歸它所有,也不再提出其他資源請求,這樣就可以保證系統不會發生死鎖。這種方式實現簡單,但缺點也顯而易見,系統資源被嚴重浪費,其中有些資源可能僅在執行初期或執行快結束時才使用,甚至根本不使用。而且還會導致“飢餓”現象,當由於個別資源長期被其他程序佔用時,將致使等待該資源的程序遲遲不能開始執行。

4) 破壞迴圈等待條件

為了破壞迴圈等待條件,可釆用順序資源分配法。首先給系統中的資源編號,規定每個程序,必須按編號遞增的順序請求資源,同類資源一次申請完。也就是說,只要程序提出申請分配資源Ri,則該程序在以後的資源申請中,只能申請編號大於Ri的資源。這種方法存在的問題是,編號必須相對穩定,這就限制了新型別裝置的增加;儘管在為資源編號時已考慮到大多數作業實際使用這些資源的順序,但也經常會發生作業使用資源的順序與系統規定順序不同的情況,造成資源的浪費;此外,這種按規定次序申請資源的方法,也必然會給使用者的程式設計帶來麻煩。

死鎖避免

避免死鎖同樣是屬於事先預防的策略,但並不0是事先釆取某種限制措施破壞死鎖的必要條件,而是在資源動態分配過程中,防止系統進入不安全狀態,以避免發生死鎖。這種方法所施加的限制條件較弱,可以獲得較好的系統性能。

1. 系統安全狀態

避免死鎖的方法中,允許程序動態地申請資源,但系統在進行資源分配之前,應先計算此次資源分配的安全性。若此次分配不會導致系統進入不安全狀態,則將資源分配給程序; 否則,讓程序等待。所謂安全狀態,是指系統能按某種程序推進順序( P1, P2, ..., Pn),為每個程序Pi分配其所需資源,直至滿足每個程序對資源的最大需求,使每個程序都可順序地完成。此時稱 P1, P2, ..., Pn 為安全序列。如果系統無法找到一個安全序列,則稱系統處於不安全狀態。假設系統中有三個程序P1、P2和P3,共有12 臺磁帶機。程序P1總共需要10臺磁帶機,P2和P3 分別需要4臺和9臺。假設在T0時刻,程序P1、P2 和P3已分別獲得5合、2臺和2臺,尚有3臺未分配,見表2-15。
表2-15 資源分配
程序最大需求已分配可用
P11053
P242
P392
則在T0時刻是安全的,因為存在一個安全序列P2、Pl、P3,即只要系統按此程序序列分配資源,則每個程序都能順利完成。若在T0時刻後,系統分配1臺磁帶機給P3,則此時系統便進入不安全狀態,因為此時已無法再找到一個安全序列。並非所有的不安全狀態都是死鎖狀態,但當系統進入不安全狀態後,便可能進入死鎖狀態;反之,只要系統處於安全狀態,系統便可以避免進入死鎖狀態。

2. 銀行家演算法

銀行家演算法是最著名的死鎖避免演算法。它提出的思想是:    把作業系統看做是銀行家,作業系統管理的資源相當於銀行家管理的資金,程序向作業系統請求分配資源相當於使用者向銀行家貸款。    作業系統按照銀行家制定的規則為程序分配資源,當程序首次申請資源時,要測試該程序對資源的最大需求量,如果系統現存的資源可以滿足它的最大需求量則按當前的申請量分配資源,否則就推遲分配。    當程序在執行中繼續申請資源時,先測試該程序已佔用的資源數與本次申請的資源數之和是否超過了該程序對資源的最大需求量。若超過則拒絕分配資源,若沒有超過則再測試系統現存的資源能否滿足該程序尚需的最大資源量,若能滿足則按當前的申請量分配資源,否則也要推遲分配。 死鎖的檢測:前面紹的死鎖預防和避免演算法,都是在為程序分配資源時施加限制條件或進行檢測,若系統為程序分配資源時不釆取任何措施,則應該提供死鎖檢測和解除的手段。

資源分配圖

系統死鎖,可利用資源分配圖來描述。如圖2-17所示,用圓圈代表一個程序,用框代表一類資源。由於一種型別的資源可能有多個,用框中的一個點代表一類資源中的一個資源。從程序到資源的有向邊叫請求邊,表示該程序申請一個單位的該類資源;從資源到程序的邊叫分配邊,表示該類資源已經有一個資源被分配給了該程序。在圖2-17所示的資源分配圖中,程序P1已經分得了兩個R1資源,並又請求一個R2 資源;程序P2分得了一個R1和一個R2資源,並又請求一個R1資源。

死鎖定理

可以通過將資源分配圖簡化的方法來檢測系統狀態S是否為死鎖狀態。簡化方法如下:
1) 在資源分配圖中,找出既不阻塞又不是孤點的程序Pi(即找出一條有向邊與它相連,且該有向邊對應資源的申請數量小於等於系統中已有空閒資源數量。若所有的連線該程序的邊均滿足上述條件,則這個程序能繼續執行直至完成,然後釋放它所佔有的所有資源)。消去它所有的請求邊和分配邊,使之成為孤立的結點。在圖2-18(a)中,P1是滿足這一條件的程序結點,將P1的所有邊消去,便得到圖248(b)所示的情況。2) 程序Pi所釋放的資源,可以喚醒某些因等待這些資源而阻塞的程序,原來的阻塞程序可能變為非阻塞程序。在圖2-17中,程序P2就滿足這樣的條件。根據第1) 條中的方法進行一系列簡化後,若能消去圖中所有的邊,則稱該圖是可完全簡化的,如圖2-18(c)所示。S為死鎖的條件是當且僅當S狀態的資源分配圖是不可完全簡化的,該條件為死鎖定理。

死鎖的解除

一旦檢測出死鎖,就應立即釆取相應的措施,以解除死鎖。死鎖解除的主要方法有:1) 資源剝奪法。掛起某些死鎖程序,並搶佔它的資源,將這些資源分配給其他的死鎖程序。但應防止被掛起的程序長時間得不到資源,而處於資源匱乏的狀態。2) 撤銷程序法。強制撤銷部分、甚至全部死鎖程序並剝奪這些程序的資源。撤銷的原則可以按程序優先順序和撤銷程序代價的高低進行。3) 程序回退法。讓一(多)個程序回退到足以迴避死鎖的地步,程序回退時自願釋放資源而不是被剝奪。要求系統保持程序的歷史資訊,設定還原點。