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