死鎖的產生以及解決死鎖的辦法

前言:繼續學習操作系統相關知識,做一個關于 Deadlock 的總結

死鎖是什么

用通俗的話說:死鎖就是一組 進程/線程 都進行不下去了,都要等待自己這一組其他的 進程/線程 執行下去的局面

死鎖產生的條件

想要解決死鎖,我們得知道死鎖產生的條件

  • 互斥

    如果相同的資源都不用互斥,也就不會產生死鎖了,進程/線程 A 直接把進程 B 的資源拿走

  • 保持并等待或資源保留

    進程/線程 當前持有至少一個資源并請求其他進程持有的其他資源

  • 沒有釋放

    資源只能由持有它的進程自愿釋放

  • 循環等待

    每個 進程/線程 必須等待另一個進程持有的資源,而該進程又等待第一個進程釋放資源

其中最后一個條件是死鎖產生的充分條件,如果產生了循環等待就一定會產生死鎖

死鎖的預防

我們從這個圖就可以看出來,一旦死鎖發生,除了強行剝奪某個 進程/線程 的資源,否則死鎖是很難解決的

但是一旦剝奪某個 進程/線程 的資源,實質上上讓一個 進程/線程 之前的操作白白執行了

所以我們盡可能避免死鎖產生,因此引入一個很經典的算法:銀行家算法

下面詳細介紹這個算法

銀行家算法

銀行家算法本質上是去如何如何給進程分配資源,從而避免死鎖

首先我們得知道三個東西(括號里面的內容會在后面展示出來):

  • 每個進程可能請求的每個資源有多少(Claim Matrix)
  • 每個進程當前持有多少資源(Allocation Matrix)
  • 系統當前有多少資源可用(Available Vector)

銀行家算法能從上面的必要條件按某種順序如 <P1,P2,...,Pn> (稱 <P1,P2,...,Pn> 為安全序列),來為每個進程分配其所需資源,直至最大需求,使每個進程都可順序完成,則稱系統處于 safe state。若系統不存在這樣一個安全序列,則稱系統處于 unsafe state。

算法舉例

P 代表進程,R 代表資源

我舉個例子告訴你這張圖是什么意思:

從 Claim Matrix 中可以看到(僅僅是舉例):

  • P1 分別需要 3 個 R1 資源、2 個 R2 資源、3 個 R3 資源(Claim Matrix)

  • 已經給 P1 分配了 1 個 R1 資源、0 個 R2 資源、0 個 R3 資源

  • 系統還剩下 1 個 R1 資源、1 個 R2 資源、2 個 R3 資源

現在開始我們來銀行家算法(真的不難):

首先計算出需求矩陣(C - A)

| 2 | 2 | 2 |
| 1 | 0 | 2 |
| 1 | 0 | 3 |
| 4 | 2 | 0 |

還剩下的資源:

| 1 | 1 | 2 |

只能給 P2,P2 運行完并釋放資源

還需要的資源:

| 2 | 2 | 2 |
| 0 | 0 | 0 |
| 1 | 0 | 3 |
| 4 | 2 | 0 |

還剩下的資源:

| 2 | 0 | 4 |

可以給 P1 P3,我們假設給 P1

P1 執行完

還需要的資源:

| 0 | 0 | 0 |
| 0 | 0 | 0 |
| 1 | 0 | 3 |
| 4 | 2 | 0 |

還剩下的資源:

| 4 | 2 | 4 |

一直這樣執行,直到能找到一個序列,能使這些 進程/線程 能夠不出現死鎖

這就是銀行家算法,也有可能一開始在計算的過程中一開始能夠分配,到后來就不能分配了,這個就像遞歸調用,如果這個不行,就回退,直到找到,

如果找不到,就是不安全的狀態,如果找得到,就是安全狀態

死鎖的檢測與解決

  • 檢測死鎖不同于預防死鎖,不限制資源訪問方式和資源申請
  • OS 周期性地執行死鎖檢測例程,檢測系統中是否出現“環路等待”

如果出現「環路等待」就說明出現了死鎖,解決死鎖的辦法就是

  • 重啟系統(最簡單)
  • 撤銷進程、剝奪資源(有多種策略:比如按進程占用資源的大小,撤掉占用最少的)
  • 進程回退策略(不現實)
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。