互斥與死鎖
阿新 • • 發佈:2019-02-13
死鎖
定義 :在一個程序集合中,所有的程序都在等待只能由該程序集合中的其它程序才能引發的事件,這就是死鎖解釋 :由於程序集合中的所有程序都在等待集合中的其它程序引發喚醒該程序的事件,所以所有程序都會阻塞而無法向前推進。一般大多數的等待事件都是釋放程序集合中其它程序所佔有的資源,也叫資源死鎖。資源死鎖的四大必須條件 :1>互斥條件:即某個資源在一段時間內只能由一個程序佔有,不能同時被兩個或以上的程序佔有2>請求與保持:程序至少已經佔有一個資源,但又申請新的資源;由於該資源已被另外程序佔有,此時該程序阻塞;但是,它在等待新資源之時,仍繼續佔用已佔有的資源3>不可搶佔條件:程序所獲得的資源在未使用完畢之前,資源申請者不能強行地從資源佔有者手中奪取資源,而只能由該資源的佔有者程序自行釋放死鎖預防
防止死鎖的發生只需破壞死鎖產生的四個必要條件之一即可。1) 破壞互斥條件
如果允許系統資源都能共享使用,則系統不會進入死鎖狀態。但有些資源根本不能同時訪問,如印表機等臨界資源只能互斥使用。所以,破壞互斥條件而預防死鎖的方法不太可行,而且在有的場合應該保護這種互斥性。2) 破壞不剝奪條件
當一個已保持了某些不可剝奪資源的程序,請求新的資源而得不到滿足時,它必須釋放已經保持的所有資源,待以後需要時再重新申請。這意味著,一個程序已佔有的資源會被暫時釋放,或者說是被剝奪了,或從而破壞了不可剝奪條件。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 資源分配 | |||
程序 | 最大需求 | 已分配 | 可用 |
P1 | 10 | 5 | 3 |
P2 | 4 | 2 | |
P3 | 9 | 2 |
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狀態的資源分配圖是不可完全簡化的,該條件為死鎖定理。