在學習作業系統中進程的時候,會接觸到進程死結這個名稱。那麼什麼是進程死結?
進程死結指的是:如果多個進程同時佔有對方需要的資源而同時請求對方的資源,而它們在得到請求之前不會釋放所佔有的資源,那麼就會導致死結的發生,也就是進程不能實現同步。
那麼死結是怎樣產生的?
死結的產生有四個必要條件:
互斥條件:即一個資源每次只能被一個進程使用(在作業系統中這是真實存在的情況)
保持和等待條件:有一個進程已獲得了一些資源,但因請求其他資源被阻塞時,對已獲得的資源保持不放
不剝奪條件:有些系統資源是不可剝奪的,當某個進程已獲得這種資源後,系統不能強行收回,只能由進程使用完成時自己釋放
環路等待條件:若干個進程形成環形鏈,每個都佔用對方要申請的下一個資源
而避免死結最具有代表性的就是——銀行家演算法
至於什麼是銀行家演算法,這裡就不再贅述了,說實話,單憑概念很難理解它的含義,還是通過講解例子,來理解到底什麼是銀行家演算法。
例題:假設系統中有三類互斥資源R1、R2、R3,可用資源數分別是9、8、5.在T0時刻,系統中有P1、P2、P3、P4和P5五個進程,這些進程對資源的最大需求量和已指派的資源數如下所示,如果進程按照______序列執行,那麼系統狀態是安全的。
解答過程:
從題目給出的進程資源表可以看出,對於資源R1、R2、R3,它們已經提前各自分配了一部分,現在我們看一下,是否還有剩餘。
R1=9-(1+2+2++1)=2
R2=8-(2+1+1+2+1)=1
R3=5-(1+1+3)=0
同時,對於五個進程,系統分配給了他們各自一部分資源,這一部分資源是否能夠滿足他們,根據還需資源=最大需求量—已指派資源數來求,結果如下
|
資源
進程 |
最大需求量
R1 R2 R3 |
已指派資源數
R1 R2 R3 |
剩餘資源
R1 R2 R3 |
還需資源數
R1 R2 R3 |
|
P1 |
6 5 2 |
1 2 1 |
2 1 0
|
5 3 1 |
|
P2 |
2 2 1 |
2 1 1 |
0 1 0 |
|
P3 |
8 1 1 |
2 1 0 |
6 0 1 |
|
P4 |
1 2 1 |
1 2 0 |
0 0 1 |
|
P5 |
3 4 4 |
1 1 3 |
2 3 1 |
很明顯,“剩餘資源”只能滿足進程P2的要求
|
資源
進程 |
最大需求量
R1 R2 R3 |
已指派資源數
R1 R2 R3 |
剩餘資源
R1 R2 R3 |
還需資源數
R1 R2 R3 |
|
P2 |
2 2 1 |
2 1 1 |
2 1 0 |
0 1 0 |
那麼就先開始運行進程P2。當P2運行之後,已“分配的資源”要釋放出來,此時剩餘資源=上一個進程的剩餘資源+“已指派資源”(中P2已經執行完畢了)
|
資源
進程 |
最大需求量
R1 R2 R3 |
已指派資源數
R1 R2 R3 |
剩餘資源
R1 R2 R3 |
還需資源數
R1 R2 R3 |
|
P2 |
2 2 1 |
2 1 1 |
4 2 1 |
0 1 0 |
根據比較可以看出“剩餘資源”完全滿足進程P4,以此類推,可以得到最後的結果表
|
資源
進程 |
最大需求量
R1 R2 R3 |
已指派資源數
R1 R2 R3 |
剩餘資源
R1 R2 R3 |
還需資源數
R1 R2 R3 |
|
|
|
|
2 1 0 |
|
|
P2 |
2 2 1 |
2 1 1 |
4 2 1 |
0 1 0 |
|
P4 |
1 2 1 |
1 2 0 |
5 4 1 |
0 0 1 |
|
P1 |
6 5 2 |
1 2 1 |
6 6 2 |
5 3 1 |
|
P5 |
3 4 4 |
1 1 3 |
8 7 2 |
2 3 1 |
|
P3 |
8 1 1 |
2 1 0 |
10 8 2 |
6 0 1 |
銀行家是計算並不難,主要就是有些繁瑣,在計算的時候需要耐心。