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

