將死鎖比喻成火災,處理死鎖的方法同樣可以模擬處理火災,從而將處理死鎖分為預防、避免、檢測與恢復四個方面。
預防的目的就是從源頭杜絕死鎖的發生,確保系統永遠都不會進入死鎖狀態。針對coffman的死鎖發生的4個必要條件,從這4個必要條件入手,可以得出預防死鎖的具體方法。
1.破壞互斥條件
如果乙個資源不會被乙個程序獨自占有,那麼就不會發生資源死鎖。破壞這個條件的方法就是允許多個程序同時訪問乙個資源例項。
2.破壞占有和等待條件
禁止已持有資源的程序再等待其他資源。實現方法可以是規定程序在開始執行前就請求全部需要的資源,如果全部資源都可用,那麼就分配所有請求資源給該程序,允許這個程序執行,否則則讓程序等待,直到所有的請求的資源全部可用才執行程式。
3.破壞不可搶占條件
申請的資源不能立即使用則釋放。
4.破壞環路條件
一種實現方法是保證每乙個程序在任何時候只能占用乙個資源,如果需要請求另乙個資源,則必須釋放當前占用的資源。另一種是將所有資源統一編號,程序可以在任何時刻提出資源請求,但是所有資源必須按照資源編號的順序提出。
死鎖避免需要利用額外的先驗證資訊,判斷系統會不會出現死鎖。系統只允許不會出現死鎖的程序請求資源。當乙個程序在請求資源的時候,系統判斷如果系統將請求的資源分配給了該程序,系統會不會發生死鎖。如果會,則拒絕請求,避免系統發生死鎖。
這種判斷也就是判斷系統是否出了安全狀態。處於安全狀態的系統,一定不會發生死鎖;反之,處於不安全狀態的死鎖,可能會出現死鎖。處於不安全狀態,並不是一定發生死鎖。
死鎖避免演算法——銀行家演算法
假設r1,r2,r3是三種資源型別,t1,t2,t3,t4是四個程序。銀行家演算法工作的前提是已知以上三個矩陣的資料,判斷在允許所有程式執行的情況下,系統的安全狀態,也就是系統會不會死鎖。
以上圖中的資料為例,銀行家演算法究竟是怎樣工作的?
當前可用資源可以滿足t2程序的當前資源請求,那麼系統會允許t2的申請,將資源(0,0,1)分配給程序t2,t2完成後釋放所有資源,系統當前可用的資源變為(6,2,4) 。系統當前可用資源變為(6,2,4)之後,程序t1,t3,t4的請求都可滿足(順序滿足,不是同時滿足)。所有程序的資源請求都能滿足,該系統就處於安全狀態,系統不會發生死鎖。
大多數作業系統都忽略死鎖,又應用程式處理死鎖。鴕鳥演算法就是無視死鎖的一種死鎖恢復演算法。
鴕鳥演算法:鴕鳥把頭埋進沙子裡,假裝問題根本就沒有發生。對於死鎖,不採取任何預防措施,在發生死鎖之後,系統自動的做重啟和恢復。(第一次聽說這個演算法,驚了!!!還有這種操作,哈哈)
另一種演算法是,對於t時刻,假設存在以下狀態:
對於程序t1,t3不需要再請求資源,待這兩個程序完成之後,可以釋放已經占有的資源,當前可用資源變為(3,1,3),此後,當前可用資源數量,滿足剩下任意程序的需求,系統不會死鎖。本人覺得,差不多就是銀行家演算法,但是在死鎖檢查中,這個工作的定時進行的,也就是說,在某一週期內,系統會進行一次該演算法,確定系統是否處於安全狀態,不會發生死鎖。
進行死鎖恢復有3種方法:1.終止程序。在終止程序中,比較需要重要考慮的是程序終止的順序。是根據程序的優先順序順序,還是程序已執行時間,或者是程序占用資源數量,確定先終止哪乙個程序? 2.資源搶占。利用資源搶占,打破死鎖環路。 3.回滾恢復。回退到安全狀態後,重啟程序。
OS回顧 死鎖
互斥訪問條件 即乙個資源一段時間內只能被乙個執行緒占有,不能被兩個或兩個以上執行緒占有 不可搶占條件 當乙個資源正在被乙個程序占用時,不可以被其他程序搶占 占有且申請條件 程序已經保持了至少乙個資源,但又提出了新的資源請求,而該資源已被其他程序占有,此時請求程序被阻塞,但對自己已獲得的資源保持不放。...
處理死鎖和預防死鎖的方法
目前,處理死鎖的方法可歸結為以下四種 1 預防死鎖。這是一種較為簡單和直觀的事先預防的方法。該方法是通過設定某些限制條件,去破壞產生死鎖的四個必要條件中的乙個或幾個條件,來預防發生死鎖。預防死鎖是一種較易實現的方法,已被廣泛使用。但由於所施加的限制條件往往太嚴格,因而可能導致系統資源利用率和系統吞吐...
死鎖的概念 處理方法
1 產生死鎖的原因 1 競爭資源。程序競爭數量不足的資源。2 程序間推進順序非法。程序請求和釋放資源的順序不當。2 產生死鎖的必要條件 1 互斥條件 程序對分配到的資源進行排他性使用,即在一段時間內某資源只由乙個程序占用。2 請求和保持條件 程序在保持了至少乙個資源的時候提出了新的資源請求,但該資源...