什么叫死鎖?
所謂死鎖: 是指兩個(gè)或兩個(gè)以上的進(jìn)程在執(zhí)行過(guò)程中,因爭(zhēng)奪資源而造成的一種互相等待的現(xiàn)象,若無(wú)外力作用,它們都將無(wú)法推進(jìn)下去。
那么為什么會(huì)產(chǎn)生死鎖呢?
1.因?yàn)橄到y(tǒng)資源不足。
2.進(jìn)程運(yùn)行推進(jìn)的順序不合適。
3.資源分配不當(dāng)。
1、產(chǎn)生死鎖的四個(gè)必要條件并舉個(gè)例子說(shuō)明死鎖的產(chǎn)生
首先我們要明白死鎖的定義,死鎖是兩個(gè)或多個(gè)進(jìn)程對(duì)資源的需求引起的沖突,可以做個(gè)比喻,就像一根獨(dú)木橋上有兩個(gè)人迎面走,相遇時(shí),都在等著對(duì)方讓路,但是誰(shuí)也不同意退回去讓對(duì)方先走,導(dǎo)致誰(shuí)也到不了對(duì)岸。兩個(gè)人就是兩個(gè)程序,他們都占有橋這個(gè)資源不愿放手,于是便一直處于等待狀態(tài)。
死鎖的產(chǎn)生有四個(gè)必要條件:
①互斥使用(資源獨(dú)占),任意時(shí)間內(nèi)進(jìn)程對(duì)其占有的資源有排他控制性,其它申請(qǐng)的進(jìn)程必須等待
②非剝奪控制,除非是進(jìn)程自動(dòng)放棄對(duì)資源的占有,否則其他進(jìn)程無(wú)法強(qiáng)制使其釋放,即使它處于阻塞態(tài)
③零散請(qǐng)求,即進(jìn)程可根據(jù)自己的需求在不同的時(shí)間發(fā)出申請(qǐng),而不必集中在一起申請(qǐng),當(dāng)申請(qǐng)不到資源時(shí),也不會(huì)改變其原先占有的資源
④循環(huán)等待,等待資源的進(jìn)程形成了一個(gè)封閉的鏈,鏈中進(jìn)程都在等待下一進(jìn)程結(jié)束,陷入了無(wú)休止的等待當(dāng)中
四個(gè)條件,破壞其一,就不屬于死鎖了
比如說(shuō)有兩個(gè)進(jìn)程A和B,當(dāng)前A占有打印機(jī),B占有磁帶,而它們又同時(shí)申請(qǐng)對(duì)方占有的設(shè)備,結(jié)果兩個(gè)進(jìn)程的申請(qǐng)都得不到滿(mǎn)足,就進(jìn)入了無(wú)休止的等待,形成死鎖。
2、預(yù)防死鎖的各種方法
預(yù)防死鎖方法的得來(lái)是源自于它的四個(gè)必要條件
①破壞互斥條件:讓資源允許共享,如SPOOLing技術(shù)就可以允許若干個(gè)進(jìn)程同時(shí)產(chǎn)生打印數(shù)據(jù),但是類(lèi)似于SPOOLing的技術(shù)并不適用于所有的資源,如進(jìn)程表等,所以破壞資源的互斥性是比較困難的,該方法并不是很好
②破壞不可剝奪條件:有兩種方法,一種是當(dāng)其申請(qǐng)的資源得不到滿(mǎn)足時(shí),也必須放棄其原先占有的資源;另一種方法是只適用于申請(qǐng)資源的進(jìn)程優(yōu)先級(jí)比占有該資源的進(jìn)程優(yōu)先級(jí)高時(shí),如果一個(gè)進(jìn)程申請(qǐng)的資源被其它進(jìn)程占用,而申請(qǐng)進(jìn)程的優(yōu)先級(jí)較高,那么它可以強(qiáng)迫占有資源的進(jìn)程放棄。這種方法一般適用于處理機(jī)和存儲(chǔ)資源。
③破壞零散請(qǐng)求條件:一般采用靜態(tài)分配策略,靜態(tài)分配是指當(dāng)一個(gè)進(jìn)程在得到其所需要的所有資源之后才執(zhí)行。采取這種機(jī)制,那么進(jìn)程在執(zhí)行過(guò)程中就不再申請(qǐng)資源了,但這種方法的效率極低,資源無(wú)法得到充分的利用。
④破壞循環(huán)等待條件:可以按照資源的特性,給資源從小到大編號(hào),進(jìn)程必須按照從小到大的順序申請(qǐng)資源,且規(guī)定進(jìn)程占有的資源號(hào)必須小于申請(qǐng)的資源號(hào)才能提出申請(qǐng)
這里我們可以用這種方法來(lái)解決一個(gè)哲學(xué)家就餐問(wèn)題:
該問(wèn)題是Dijkstra在1968年提出的,如圖,在一個(gè)圓餐桌上有5份通心粉,間隔放有5把叉子,5個(gè)哲學(xué)家各自坐在一盤(pán)通心粉前。哲學(xué)家思考時(shí),他們不作任何動(dòng)作。當(dāng)他們饑餓的時(shí)候,必須同時(shí)手拿兩把叉子才能吃到通心粉,而且只能取得自己左手邊和右手邊的叉子。吃完后,叉子放回。
我們可以把五個(gè)哲學(xué)家比喻成五個(gè)進(jìn)程,五把叉子就是五種資源。當(dāng)哲學(xué)家們吃東西的時(shí)間相繼發(fā)生時(shí),那么每個(gè)人都可以吃到通心粉,但是若他們同時(shí)感到饑餓,并同時(shí)拿起手邊的一把叉子,那么有可能五個(gè)人都因無(wú)法再取得一把叉子而永遠(yuǎn)吃不到通心粉,這就是“死鎖”問(wèn)題。那么我們?nèi)绾芜\(yùn)用“破壞循環(huán)等待”法來(lái)解決它呢?
我們可以給五把叉子依次編號(hào)為0~4,規(guī)定哲學(xué)家必須先拿小號(hào)叉子,再拿大號(hào)叉子,若小號(hào)叉子被占用,他就進(jìn)入阻塞態(tài)。這樣的話(huà),即使五個(gè)哲學(xué)家同時(shí)伸出左手,那么第4號(hào)哲學(xué)家應(yīng)該先拿0號(hào)叉子,但是0號(hào)叉子被第一個(gè)哲學(xué)家所占據(jù),所以,4號(hào)哲學(xué)家就會(huì)因無(wú)法占有0號(hào)叉子從而無(wú)法申請(qǐng)4號(hào)叉子,進(jìn)入了阻塞態(tài)。那么拿3號(hào)叉子的哲學(xué)家可以申請(qǐng)拿4號(hào)叉子,從而先吃完通心粉,釋放其占據(jù)的叉子,喚醒其他哲學(xué)家進(jìn)程,以此類(lèi)推,大家都可以吃完通心粉。問(wèn)題得到解決~
3、資源分配圖的化簡(jiǎn)
①檢查圖中有無(wú)環(huán)路,如果沒(méi)有,系統(tǒng)不會(huì)發(fā)生死鎖,結(jié)束檢測(cè),如果有環(huán)路,繼續(xù)第②步
②若環(huán)路中設(shè)計(jì)的每個(gè)資源類(lèi)只有一個(gè)資源,那么系統(tǒng)一定是死鎖,若每個(gè)資源類(lèi)有多個(gè)資源,可進(jìn)行第③步
③在環(huán)路中找到非阻塞非獨(dú)立的進(jìn)程Pi,且滿(mǎn)足|(Pi,Ri)|+∑|(Ri,Pi)|<=M(注:(Pi,Ri)表示進(jìn)程Pi向資源Ri的申請(qǐng)個(gè)數(shù),(Ri,Pi)是 資源Ri給進(jìn)程Pi分配的資源個(gè)數(shù)),即它可以在有限的時(shí)間內(nèi)將申請(qǐng)獲得的資源執(zhí)行完畢。找到進(jìn)程之后,把與該進(jìn)程相連的有向邊全部去掉,形成孤立結(jié)點(diǎn)。反復(fù)執(zhí)行步驟③,知道沒(méi)有進(jìn)程可被簡(jiǎn)化。