日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > linux >内容正文

linux

linux中死锁的概念,【Linux】死锁概念总结

發(fā)布時(shí)間:2023/12/10 linux 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 linux中死锁的概念,【Linux】死锁概念总结 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

什么是死鎖

如果一組進(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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。