在操作系統的運行當中,多個進程由於對於臨界資源的競爭或者進程推進的順序不對可能會產生死鎖現象。
一、產生死鎖的四個條件
1、互斥條件
2、保持和請求條件
3、不剝奪條件
4、環路等待條件
二、處理死鎖的基本方法
1、預防死鎖(不會發生死鎖)
2、避免死鎖()
3、監測死鎖
4、解除死鎖(死鎖已經發生之后的補救措施)
三、預防死鎖
去掉產生死鎖的后三個條件,這樣死鎖不會產生
四、避免死鎖
死鎖可能會產生,但是我們要去避免它。這里需要介紹銀行家算法。
1、所謂銀行家算法是是指,系統在為進程分配資源之前,首先計算此次資源分配的安全性,如果是安全的,則進行分配;如果這次分配會導致進入不安全狀態,不進行分配。所謂的安裝狀態是指存在一個進程序列,如果按照這個順序為各個進程分配資源,則所有的進程都能順利運行完成,這是我們說系統是安全的,這個序列叫做安全序列。
2、銀行家算具體過程
這里首先是幾個符號定義
可用資源向量$available_{i},i=1,2,3,...,N$
資源需求矩陣$need_{i}^{j},i=1,2,3,...,N.j=1,2,3,...,K$,表示第j個進程對第i種資源的最多還需要多少資源,也就是系統最多還可以分給這個進程多少個資源i。
資源分配矩陣$allocation_{i}^{j},i=1,2,3,...,N.j=1,2,3,...,K$,表示第j個進程目前所占有的第i種資源的數量。
最大需求矩陣$max_{i}^{j},i=1,2,3,...,N.j=1,2,3,...,K$,表示第j個進程對第i種資源的最多的需要資源總量。
上面的矩陣有下面的關系
allocation+need=max
所以在下面的算法當中實際上並沒有用到max矩陣
假設現在有個進程發出了資源請求$request_{i}$,i表示第i個進程
step 1、判斷$request_{i}$是否小於$need_{i}$,如果是轉入step 2,否則,exit,因為進程在說謊
step 2、判斷$request_{i}$是否小於$available$,如果是則進入step 3,否則將進程掛起,因為沒有足夠資源
step 3、首先假設滿足進程i的資源請求
$available=available-request$
$need=need-request$
$allocation=allocation+request$
step 4、進行安全性監測
找到一個進程它的need小於available,則表明可以首先運行這個進程,這個進程運行完之后,會釋放資源,所以增加available。這樣進行下去,直到所有的進程都可假設執行完畢,我們說這是找到了一個安全路徑,所以本次資源分配是可行的。否則掛起進程等待。
五、監測死鎖
六、解除死鎖