各進程在使用系統(tǒng)資源時,應(yīng)注意系統(tǒng)產(chǎn)生死鎖問題。下面先介紹什么是死鎖。
1 死鎖的概念
1. 死鎖的定義
所謂死鎖,是指各并發(fā)進程彼此互相等待對方所擁有的資源,且這些并發(fā)進程在得到對方的資源之前不會釋放自己所擁有的資源。從而造成大家都想得到資源而又都得不到資源,各并發(fā)進程不能繼續(xù)向前推進的狀態(tài)。
2. 死鎖的起因
死鎖發(fā)生原因:死鎖的起因是并發(fā)進程的資源競爭。產(chǎn)生死鎖的根本原因在于系統(tǒng)提供的資源個數(shù)少于并發(fā)進程所要求的該類資源數(shù)。顯然,由于資源的有限性,我們不可能為所有要求資源的進程無限制地提供資源。但是,我們可以采用適當(dāng)?shù)馁Y源分配算法,以達到消除死鎖的目的。
3. 產(chǎn)生死鎖的必要條件
只有4個條件都滿足時,才會出現(xiàn)死鎖。
(1) 互斥條件:并發(fā)進程所要求和占有的資源是不能同時被兩個以上進程使用或操作的,進程對它所需要的資源進行排它性控制。
(2) 不剝奪條件:進程所獲得的資源在未使用完畢之前,不能被其它進程強行剝奪,而只能由獲得該資源的進程自己釋放。
(3) 部分分配:進程每次申請它所需要的一部分資源,在等待新資源的同時,繼續(xù)占用已分配到的資源。
(4) 環(huán)路條件:存在一種進程循環(huán)鏈,鏈中每一個進程已獲得的資源同時被下一個進程所請求。
2 死鎖的排除方法
處理死鎖的基本方法可歸結(jié)為以下3種:
方法
資源分配策略
各種可能模式
主要優(yōu)點
主要缺點
預(yù)防
Prevention
保守的;寧可資源閑置
一次請求所有資源<條件1>
資源剝奪
<條件3>
資源按序申請
<條件4>
適用于作突發(fā)式處理的進程;不必剝奪
適用于狀態(tài)可以保存和恢復(fù)的資源
可以在編譯時(而不必在運行時)就進行檢查
效率低;進程初始化時間延長
剝奪次數(shù)過多;多次對資源重新起動
不便靈活申請新資源
避免
Avoidance
是“預(yù)防”和“檢測”的折衷(在運行時判斷是否可能死鎖)
尋找可能的安全的運行順序
不必進行剝奪
必須知道將來的資源需求;進程可能會長時間阻塞
檢測
Detection
寬松的;只要允許,就分配資源
定期檢查死鎖是否已經(jīng)發(fā)生
不延長進程初始化時間;允許對死鎖進行現(xiàn)場處理
通過剝奪解除死鎖,造成損失
1. 死鎖的預(yù)防
死鎖的預(yù)防:是采用某種策略,限制并發(fā)進程對資源的請求,使系統(tǒng)在任何時刻都不滿足死鎖的必要條件。
預(yù)防死鎖的三種策略:
打破死鎖資源的互斥和不可剝奪這兩個條件
缺點:不能解決訪問那些不允許被同時訪問的資源時所帶來的死鎖問題。
打破資源的部分分配這個死鎖產(chǎn)生的必要條件
缺點:在許多情況下,一個進程在執(zhí)行之前不可能提出它所需要的全部資源。
無論所需資源何時用到,一個進程只有在所有要求資源都得到滿足后才開始執(zhí)行。
對于那些不經(jīng)常使用的資源,進程在生存過程期間一直占用它們是一種極大的浪費。
降低了進程的并發(fā)性。
打破死鎖的環(huán)路條件
缺點:限制了進程對資源的請求,而且對資源的分類編序也耗去一定的系統(tǒng)開銷。
2. 死鎖的避免
死鎖的避免:在系統(tǒng)運行過程中,對進程發(fā)出的每一個系統(tǒng)能夠滿足的資源申請進行動態(tài)檢查,并根據(jù)檢查結(jié)果決定是否分配資源,若分配后系統(tǒng)可能發(fā)生死鎖,則不予分配,否則予以分配。
在分配資源時判斷是否會出現(xiàn)死鎖,如不會死鎖,則分配資源。
死鎖避免的一種基本模式是把進程分為多個步,其中每個步所使用的資源是固定的,且在一個步內(nèi),進程所保持的資源數(shù)不變。即進程的資源請求、使用與釋放要依靠不同的步完成。
3. 死鎖的檢測和恢復(fù)
保存資源的請求和分配信息,利用某種算法對這些信息加以檢查,以判斷是否存在死鎖。
死鎖檢測算法主要是檢查是否有循環(huán)等待。
1 死鎖的概念
1. 死鎖的定義
所謂死鎖,是指各并發(fā)進程彼此互相等待對方所擁有的資源,且這些并發(fā)進程在得到對方的資源之前不會釋放自己所擁有的資源。從而造成大家都想得到資源而又都得不到資源,各并發(fā)進程不能繼續(xù)向前推進的狀態(tài)。
2. 死鎖的起因
死鎖發(fā)生原因:死鎖的起因是并發(fā)進程的資源競爭。產(chǎn)生死鎖的根本原因在于系統(tǒng)提供的資源個數(shù)少于并發(fā)進程所要求的該類資源數(shù)。顯然,由于資源的有限性,我們不可能為所有要求資源的進程無限制地提供資源。但是,我們可以采用適當(dāng)?shù)馁Y源分配算法,以達到消除死鎖的目的。
3. 產(chǎn)生死鎖的必要條件
只有4個條件都滿足時,才會出現(xiàn)死鎖。
(1) 互斥條件:并發(fā)進程所要求和占有的資源是不能同時被兩個以上進程使用或操作的,進程對它所需要的資源進行排它性控制。
(2) 不剝奪條件:進程所獲得的資源在未使用完畢之前,不能被其它進程強行剝奪,而只能由獲得該資源的進程自己釋放。
(3) 部分分配:進程每次申請它所需要的一部分資源,在等待新資源的同時,繼續(xù)占用已分配到的資源。
(4) 環(huán)路條件:存在一種進程循環(huán)鏈,鏈中每一個進程已獲得的資源同時被下一個進程所請求。
2 死鎖的排除方法
處理死鎖的基本方法可歸結(jié)為以下3種:
方法
資源分配策略
各種可能模式
主要優(yōu)點
主要缺點
預(yù)防
Prevention
保守的;寧可資源閑置
一次請求所有資源<條件1>
資源剝奪
<條件3>
資源按序申請
<條件4>
適用于作突發(fā)式處理的進程;不必剝奪
適用于狀態(tài)可以保存和恢復(fù)的資源
可以在編譯時(而不必在運行時)就進行檢查
效率低;進程初始化時間延長
剝奪次數(shù)過多;多次對資源重新起動
不便靈活申請新資源
避免
Avoidance
是“預(yù)防”和“檢測”的折衷(在運行時判斷是否可能死鎖)
尋找可能的安全的運行順序
不必進行剝奪
必須知道將來的資源需求;進程可能會長時間阻塞
檢測
Detection
寬松的;只要允許,就分配資源
定期檢查死鎖是否已經(jīng)發(fā)生
不延長進程初始化時間;允許對死鎖進行現(xiàn)場處理
通過剝奪解除死鎖,造成損失
1. 死鎖的預(yù)防
死鎖的預(yù)防:是采用某種策略,限制并發(fā)進程對資源的請求,使系統(tǒng)在任何時刻都不滿足死鎖的必要條件。
預(yù)防死鎖的三種策略:
打破死鎖資源的互斥和不可剝奪這兩個條件
缺點:不能解決訪問那些不允許被同時訪問的資源時所帶來的死鎖問題。
打破資源的部分分配這個死鎖產(chǎn)生的必要條件
缺點:在許多情況下,一個進程在執(zhí)行之前不可能提出它所需要的全部資源。
無論所需資源何時用到,一個進程只有在所有要求資源都得到滿足后才開始執(zhí)行。
對于那些不經(jīng)常使用的資源,進程在生存過程期間一直占用它們是一種極大的浪費。
降低了進程的并發(fā)性。
打破死鎖的環(huán)路條件
缺點:限制了進程對資源的請求,而且對資源的分類編序也耗去一定的系統(tǒng)開銷。
2. 死鎖的避免
死鎖的避免:在系統(tǒng)運行過程中,對進程發(fā)出的每一個系統(tǒng)能夠滿足的資源申請進行動態(tài)檢查,并根據(jù)檢查結(jié)果決定是否分配資源,若分配后系統(tǒng)可能發(fā)生死鎖,則不予分配,否則予以分配。
在分配資源時判斷是否會出現(xiàn)死鎖,如不會死鎖,則分配資源。
死鎖避免的一種基本模式是把進程分為多個步,其中每個步所使用的資源是固定的,且在一個步內(nèi),進程所保持的資源數(shù)不變。即進程的資源請求、使用與釋放要依靠不同的步完成。
3. 死鎖的檢測和恢復(fù)
保存資源的請求和分配信息,利用某種算法對這些信息加以檢查,以判斷是否存在死鎖。
死鎖檢測算法主要是檢查是否有循環(huán)等待。

