linux中死锁的概念,【Linux】死锁概念总结
什么是死鎖
如果一組進(jìn)程(或者線程)中的所有進(jìn)程(或者線程)都在等待該組中其他進(jìn)程(或者線程)才能引發(fā)的事件,那么這組進(jìn)程(或者線程)就是死鎖的
死鎖出現(xiàn)的情況舉例
(1)線程自鎖,自己將自己鎖住
當(dāng)進(jìn)程(線程)第一次訪問一個(gè)資源時(shí),對(duì)該資源進(jìn)行加鎖;如果該進(jìn)程(線程)又對(duì)該資源試圖使用而進(jìn)行加鎖時(shí),由于鎖之前已被自己加上,便會(huì)等待鎖的釋放。這就永遠(yuǎn)處于掛起狀態(tài)了,便產(chǎn)生了死鎖。
(2)多個(gè)線程搶占資源
例如當(dāng)線程A獲得資源1時(shí),線程B獲得資源2時(shí);然后此時(shí),線程A又對(duì)2資源進(jìn)行請(qǐng)求,線程B又對(duì)1進(jìn)行請(qǐng)求,這樣線程A,B都將等待另一個(gè)線程釋放資源,于是線程A,B又永遠(yuǎn)處于掛起狀態(tài)了,這又是死鎖產(chǎn)生的一種情形。
系統(tǒng)中資源的分類
<1>按照重用和消耗類型
(1)可重用資源
特點(diǎn):
可以讓用戶多次使用的資源
性質(zhì):
1、每一個(gè)資源只可以讓一個(gè)進(jìn)程(或者線程)進(jìn)行占用,不可以讓多個(gè)進(jìn)程(或者線程)共享
2、使用方法:請(qǐng)求資源---使用資源---釋放資源
3、系統(tǒng)中每一個(gè)可重用資源中的數(shù)目是相對(duì)固定的,在進(jìn)程(或者線程)運(yùn)行期間不可以進(jìn)行刪除和創(chuàng)建
(2)可消耗資源
特點(diǎn):
在運(yùn)行期間創(chuàng)建和消耗
性質(zhì):
1、每一類可消耗的單元資源數(shù)目是變化的,可以為0
2、進(jìn)程(或線程)在運(yùn)行過程中可以不斷的創(chuàng)建可消耗性資源的單元,將它們放入該資源類的緩沖區(qū)中,用來增加該資源類的單元數(shù)目。
3、進(jìn)程(或線程)在運(yùn)行過程中可請(qǐng)求若干個(gè)可消耗性資源,用于自身的消耗不再將它們返回給該資源類中。
4、可消耗性資源通常是由生產(chǎn)者進(jìn)程(或線程)創(chuàng)建,由消費(fèi)者進(jìn)程(或線程)消耗。
<1>按照是否可以搶占類型
(1)不可搶占資源
當(dāng)一個(gè)進(jìn)程(或者線程)占用一個(gè)資源時(shí),其他資源必須等到該資源進(jìn)行釋放才可以使用。
例如打印機(jī)和磁帶
(2)可搶占資源
當(dāng)一個(gè)進(jìn)程(或者線程)占用一個(gè)資源時(shí),其他進(jìn)程(或者線程)、或系統(tǒng)可以對(duì)該資源進(jìn)行搶占。
例如內(nèi)存和CPU
死鎖產(chǎn)生的必要條件
(1)互斥條件,資源在同一時(shí)刻只能由一個(gè)進(jìn)程或者線程進(jìn)行占用
(2)請(qǐng)求和保持,一個(gè)進(jìn)程或者線程占用著一定數(shù)量的資源(至少一個(gè)),但又發(fā)出了新的資源請(qǐng)求,而新的資源此刻被其他進(jìn)程或者線程占用著
(3)不可搶占資源,進(jìn)程或線程在使用完占用的資源前,不可以被其他進(jìn)程或者線程搶占
(4)循環(huán)等待,發(fā)生死鎖時(shí),必然存在死鎖鏈
引起死鎖的原因
(1)競(jìng)爭(zhēng)不可搶占資源
假設(shè)系統(tǒng)中擁有兩個(gè)進(jìn)程p1和p2,它們都準(zhǔn)備寫兩個(gè)文件F1和F2。
而這兩者都屬于可重用和不可搶占性資源。
這種情況下,如果進(jìn)程p1在打開f1的同時(shí),p2進(jìn)程打開f2文件,當(dāng)p1想打開f2時(shí)由于f2已結(jié)被占用而阻塞,當(dāng)p2想打開f1時(shí)由于f1已結(jié)被占用而阻塞,此時(shí)就會(huì)無線等待下去,形成死鎖。
(2)競(jìng)爭(zhēng)可消耗資源
我們假設(shè):系統(tǒng)中擁有三個(gè)進(jìn)程p1、p2和p3以及三個(gè)可消耗資源m1、m2、m3。
進(jìn)程p1一方面產(chǎn)生消息m1,將其發(fā)送給p2,另一方面要從p3接收消息m3。
而進(jìn)程p2一方面產(chǎn)生消息m2,將其發(fā)送給p3,另一方面要從p1接收消息m1。
類似的,進(jìn)程p3一方面產(chǎn)生消息m3,將其發(fā)送給p1,另一方面要從p2接收消息m2。
這種情況下,如果三個(gè)進(jìn)程都先發(fā)送自己產(chǎn)生的消息后接收別人發(fā)來的消息,則可以順利的運(yùn)行下去不會(huì)產(chǎn)生死鎖。
但要是三個(gè)進(jìn)程都先接收別人的消息而不產(chǎn)生消息則會(huì)永遠(yuǎn)等待下去,便會(huì)產(chǎn)生死鎖。
(3)進(jìn)程推進(jìn)順序不當(dāng)產(chǎn)生死鎖
假設(shè)兩個(gè)進(jìn)程p1和p2,若p1保持了資源r1,p2保持了資源r2,則系統(tǒng)處于不安全狀態(tài),因?yàn)檫@兩個(gè)進(jìn)程再向前推進(jìn),便可能發(fā)生死鎖。
例如,當(dāng)P1運(yùn)行到P1:Request(R2)時(shí),將因R2已被P2占用而阻塞;
當(dāng)P2運(yùn)行到P2:Request(R1)時(shí),也將因R1已被P1占用而阻塞,于是發(fā)生進(jìn)程死鎖。
處理死鎖的辦法
(1)預(yù)防死鎖
具體方法:破壞死鎖必要條件中的一個(gè)或者多個(gè)
注意:互斥是必要條件,不能破壞,否則將造成不可再現(xiàn)性
(2)避免死鎖
具體方法:在資源分配過程中,防止系統(tǒng)進(jìn)入不安全的區(qū)域
(3)檢測(cè)死鎖
具體方法:通過檢測(cè)機(jī)制發(fā)現(xiàn)死鎖,并可以采取適當(dāng)措施解決死鎖
(4)解除死鎖
具體方法:當(dāng)檢測(cè)機(jī)制發(fā)現(xiàn)死鎖后,采用相應(yīng)的算法解決它
利用銀行家算法解決死鎖
1、在銀行家算法中,主要的數(shù)據(jù)結(jié)構(gòu)
(1)可利用資源向量Available[m]。m為系統(tǒng)中的資源種類數(shù),如果向量Available[j] = K,則表示系統(tǒng)中Rj類資源由K個(gè)。
(2)最大需求矩陣Max[n][m]。m為系統(tǒng)中的資源種類數(shù),n為系統(tǒng)中正在運(yùn)行的進(jìn)程(線程)數(shù),如果Max[i][j] = K,則表示進(jìn)程i需要Rj類資源的最大數(shù)目為K個(gè)。
(3)分配矩陣Allocation[n][m]。m為系統(tǒng)中的資源種類數(shù),n為系統(tǒng)中正在運(yùn)行的進(jìn)程(線程)數(shù),如果Allocation[i][j] = K,則表示進(jìn)程i當(dāng)前已分得Rj類資源的數(shù)目為K個(gè)。
(4)需求矩陣Need[n][m]。m為系統(tǒng)中的資源種類數(shù),n為系統(tǒng)中正在運(yùn)行的進(jìn)程(線程)數(shù),如果Need[i][j] = K,則表示進(jìn)程i還需要Rj類資源K個(gè)。
以上三個(gè)矩陣間的關(guān)系:
Need[i][j] = Max[i][j] - Allocation[i][j]
2、銀行家算法的具體步驟
設(shè)Request( i)是進(jìn)程Pi的請(qǐng)求向量,如果Request(i) [j] = K,表示進(jìn)程Pi需要K個(gè)Rj類型的資源。
(1)如果Request(i) [j] <= Need[i][j],轉(zhuǎn)向步驟(2)。
(2)如果Request(i) [j] <= Available[j] ,轉(zhuǎn)向步驟(3)。
(3)系統(tǒng)嘗試著把資源分給進(jìn)程Pi。
Available[j] = Available[j] - Request(i) [j];
Allocation[i][j] = Allocation[i][j] + Request(i) [j];
Need[i][j] = Need[i][j] - Request(i) [j];
(4)系統(tǒng)執(zhí)行安全性算法,檢查此次資源分配后系統(tǒng)是否處于安全狀態(tài)。
3、銀行家算法中的安全性
(1)設(shè)置兩個(gè)向量:
1、工作向量Work[m],它表示系統(tǒng)可提供給進(jìn)程繼續(xù)運(yùn)行所需要的各類資源數(shù)目,初始值Work = Available。
2、Finish:它表示系統(tǒng)是否有足夠的資源分配給進(jìn)程,使其運(yùn)行完成。開始時(shí)Finish[i] = false,當(dāng)有足夠的資源分配給進(jìn)程時(shí)Finish[i] = true。
(2)從進(jìn)程(線程)集合中找到一個(gè)能滿足下述條件的進(jìn)程(線程)。
1、Finish[i] = false
2、Need[i][j] <= Work[j],如果找到轉(zhuǎn)到步驟3》,沒找到轉(zhuǎn)到步驟4》。
3、Work[j] = Work[j] + Allocation[i][j] ;
Finish[i] = true;
go to step 2;
4、如果所有進(jìn)程(線程)的Finish[i] = true都滿足,表示系統(tǒng)處于安全狀態(tài),反之系統(tǒng)處于不安全狀態(tài)。
總結(jié)
以上是生活随笔為你收集整理的linux中死锁的概念,【Linux】死锁概念总结的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 个人结构性存款安全吗?最高损失利息收益!
- 下一篇: linux 其他常用命令