處理死鎖和預防死鎖的方法

處理死鎖的基本方法

目前,處理死鎖的方法可歸結爲以下四種:
1)預防死鎖。這是一種較爲簡單和直觀的事先預防的方法。該方法是通過設置某些限制條件,去破壞產生死鎖的四個必要條件中的一個或幾個條件,來預防發生死鎖。預防死鎖是一種較易實現的方法,已被廣泛使用。但由於所施加的限制條件往往太嚴格,因而可能導致系統資源利用率和系統吞吐量降低。
2)避免死鎖。該方法同樣是屬於事先預防策略,但它並不需要事先採取各種限制措施去破壞產生死鎖的四個必要條件,而是在資源的動態分配過程中,用某種方法去防止系統進入不安全狀態,從而避免發生死鎖。這種方法只需事先施加較弱的限制條件,便可獲得較高的資源利用率及系統吞吐量,但在實現上有一定的難度。目前在較完善的系統中常用此方法來避免發生死鎖。
3)檢測死鎖。這種方法並不需要事先採取任何限制性措施,也不必檢查系統是否已經進入不安全區,而是允許系統在運行過程中發生死鎖。但可通過系統所設置的檢測機構,及時的檢測出死鎖的發生,並精確的確定與死鎖有關的進程和資源;然後採取適當措施從系統中將已發生的死鎖清除掉。
4)解除死鎖。這是與檢測死鎖相配套的一種措施。當檢測到系統中已經發生死鎖時,將進程從死鎖狀態中解脫出來。常用的方法是撤銷或掛起一些進程,以便回收一些資源,再將這些資源分配給已經處於阻塞狀態的進程,使之轉爲就緒態,以繼續運行。死鎖的檢測和解除措施有可能使系統獲得較好的資源利用率和吞吐量,但是實現上難度也最大。

預防死鎖的基本方法

預防死鎖和避免死鎖這兩種方法實質上都是通過施加某些限制條件,來預防發生死鎖。兩者的主要差別在於:爲預防死鎖所施加的限制條件比較嚴格,這往往會影響進程的併發執行;而爲避免死鎖所加的限制條件則比較寬鬆,這給進程的運行提供了較寬鬆的環境,有利於進程的併發。

一、預防死鎖

預防死鎖的方法是使四個必要條件中的第2、3、4個條件之一不能成立,來避免發生死鎖。至於必要條件1,因爲它是由設備的固有特性所決定的,不僅不能改變,還應加以保證。
1)摒棄“請求和保持”條件
在採用這種方法時,系統規定所有進程在開始運行之前,都必須一次性的申請其在整個運行過程所需的全部資源。此時,若系統有足夠的資源分配給某進程,便可把其需要的所有資源分配給進程,這樣,該進程在整個運行期間便不會再提出資源要求,從而摒棄了請求條件。但在分配資源時,只要有一種資源不能滿足某進程的要求,即使其它所需各資源都空閒,也不分配給該進程,而讓該進程等待。由於在該進程的等待期間,它並未佔用任何資源,因而也摒棄了保持條件,從而避免發生死鎖。
這種方法的缺點是:首先表現爲資源被嚴重浪費,因爲一個進程是一次性地獲得其整個運行過程中所需的全部資源的,且獨佔資源,其中可能有些資源很少用,甚至在整個運行期間都未使用,這就嚴重的惡化了系統資源的利用率;其次是使進程延遲運行,僅當進程在獲得了其所需的全部資源後,才能開始運行,但可能因有些資源已長期被其它進程佔用而使等待該資源的進程遲遲不能運行。
2)摒棄“不剝奪”條件
在採用這種方法時系統規定,進程是逐個地提出對資源的要求的。當一個已經保持了某些資源的進程,再提出新的資源請求而不能立即滿足時,必須釋放它已經保持了的所有資源,待以後需要時再重新申請。這意味着某一進程已經佔有的資源,在運行過程中會被佔時釋放掉,也可認爲是被剝奪了,從而摒棄了“不剝奪”條件。
3)摒棄“環路等待”條件
這種方法中規定,系統將所有資源按類型進行線性排隊,並賦予不同的序號。例如,令輸入機的序號爲1,打印機的序號爲2,磁帶機爲3,磁盤爲4.所有進程對資源的請求必須嚴格按照資源序號遞增的次序提出,這樣,在所形成的資源分配圖中,不可能再出現環路,因而摒棄了“環路等待”條件。

二、系統安全狀態

在該方法中把系統的狀態分爲安全狀態和不安全狀態,只要能使系統始終處於安全狀態,便可避免發生死鎖。

1.安全狀態

在避免死鎖的方法中,允許進程動態的申請資源,但系統在進行資源分配之前,應先計算此次資源分配的安全性。若此次分配不會導致系統進入不安全狀態,則將資源分配給進程,否則,令進程等待。
所謂安全狀態,是指系統能按某種進程順序(P1,P2,……,Pn)(稱<“P1,P2,…,Pn>序列爲安全序列),來爲每個進程Pi分配其所需資源,直至滿足每個進程對資源的最大需求,使每個進程都可以順利完成。如果系統無法找到這樣一個安全序列,則稱系統處於不安全狀態。
雖然並非所有的不安全狀態都必然會轉爲死鎖狀態,但當系統進入不安全狀態後,便有可能進而進入死鎖狀態;反之,只要系統處於安全狀態,系統便可避免進入死鎖狀態。因此,避免死鎖的實質在於:系統在進行資源分配時,如何使系統不進入不安全狀態。

2.安全狀態之例

假定系統中有三個進程P1、P2和P3,共有12臺磁帶機。進程P1總共要求10臺磁帶機,P2和P3分別要求4臺和9臺。假設在T0時刻,進程P1、P2和P3已分別獲得5臺、2臺和2臺磁帶機,尚有3臺空閒未分配,如下表所示:
這裏寫圖片描述
經分析發現,在T0時刻系統是安全的,因爲這時存在一個安全序列《P2,P1,P3》,即只要系統按此進程序列分配資源,就能使每個進程都順利完成。例如,將剩餘的磁帶機取2臺分配給P2,使之繼續運行,待P2完成,便可釋放出4臺磁帶機,於是可用資源增至5臺;以後再將這些全部分配給進程P1,使之運行,待P1完成後,將釋放出10臺磁帶機,P3便能獲得足夠的資源,從而使P1、P2、P3每個進程都能順利完成。

3.由安全狀態向不安全狀態的轉換。

如果不按照安全序列分配資源,則系統可能會由安全狀態進入不安全狀態。例如在T0時刻以後,P3又請求1臺磁帶機,若此時系統把剩餘3臺中的1臺分配給P3,則系統便進入不安全狀態。因爲此時無法再找到一個安全序列,例如,把剩餘的2臺分配給P2,這樣,在P2完成後只能釋放出4臺,既不能滿足P1尚需5臺的要求,也不能滿足P3尚需6臺的需求,致使它們都無法推進前行,彼此都在等待對方釋放資源,即陷入僵局,結果導致死鎖。類似地,如果我們將剩餘的兩臺磁帶機先分配給P1或P3,也同樣都無法使它們推進完成,因此,從給P3分配了第三臺磁帶機開始,系統便又進入了不安全狀態。由此可見,在P3請求資源時,儘管系統中尚有可用的磁帶機,但卻不能分配給它,必須讓P3一直等待到P1和P2完成,釋放出資源後再將足夠的資源分配給P3,它才能順利完成。

三、利用銀行家算法避免死鎖

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章