網(wǎng)絡(luò)工程師第一章輔導(dǎo):死鎖問題

字號(hào):

各進(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)等待。