1. 程式人生 > >死鎖原因,解決,避免方法及哲學家就餐問題

死鎖原因,解決,避免方法及哲學家就餐問題

死鎖的四大條件:
互斥:資源不能共享,只能由一個程序持有
佔有且等待:當一個等待另外程序而阻塞時,資源不主動釋放
不可搶佔:作業系統不能強行搶佔被程序持有的資源
迴圈等待:存在一個封閉的程序鏈,使得每一個程序都至少佔有下個程序所需要的資源。

這個四個資源中,前面三個,基本所有作業系統都是可以滿足的。所以一般產生死鎖,第四個是關鍵。

關於死鎖的解決方法,有三種
1. 死鎖預防
2. 死鎖避免
3. 死鎖檢測且恢復

死鎖預防

死鎖預防有兩種方法:間接死鎖預防方法,即防止前三個條件;直接死鎖預防,即防止第四個條件
1. 間接死鎖預防
破壞第一個是不可能的,資源本來就是互斥的;第二個佔有且等待,可以要求程序一次性地請求所有需要的資源,並且阻塞到所有請求同時滿足;不可搶佔,將程序持有的資源搶佔,也是於理不合。
2. 直接死鎖預防
這個可以通過定義資源請求順序來解決,比如程序1,2都需要資源a,b,我們可以定義必須先得到a,才能得到b,這樣就不會發生,1搶了a,2搶了b,導致迴圈等待。

死鎖避免

死鎖避免中是否允許資源分配請求,是通過判斷該請求是否有可能導致死鎖來決定的。
1. 程序啟動拒絕。如果在程序啟動時,看看系統已經分配的和剩餘的資源能不能滿足程序需要的最大資源,如果不能,直接拒絕
2. 資源分配拒絕。採用銀行家演算法,當程序請求一組資源時,假設同意該請求,從而改變系統的狀態,然後確定其結果是能夠使系統處於安全狀態,如果是,則同意該請求,如果不是,阻塞該程序直到同意該請求後系統狀態能夠處於安全狀態。

死鎖檢測和恢復

方法:在所有程序中查詢系統所剩餘資源能夠滿足其執行完全的程序,標記該程序,然後將其資源返回系統,然後繼續查詢,直到找不到為止,然後,如果所有程序都被標記了,則沒有發生死鎖,如果存在未標記的程序,則說明系統發生了死鎖。
恢復:
1. 取消所有的死鎖程序
2. 連續取消死鎖程序,直到不再死鎖。

哲學家就餐問題

問題描述:

這裡寫圖片描述

解決方法

1 訊號量,5個人5只筷子,根據鴿籠原理,是有可能發生死鎖的。例如,當所有哲學家都同時拿起左邊的筷子時,就會形成死鎖。所以可以限制人數,當4個人5只筷子時,根據鴿籠原理,是一定不會發生死鎖的。所以,我們可以定義一個四個資源的訊號量,來限制吃麵條的哲學家人數為4個。
2 讓哲學家就餐時,隨機拿起左右筷子,而不是都是同一個方向,雖然可以減少,但是還是存在死鎖問題。
3 採用回退方法。例如a哲學家拿起左邊筷子後,當想拿起右邊筷子時,發現被b哲學家拿走了,這個時候,就比較一下a,b哲學家到底是誰先拿起筷子的,如果慢拿起筷子那個,就把回退,把筷子放下。