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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

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

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

什么是死鎖

如果一組進程(或者線程)中的所有進程(或者線程)都在等待該組中其他進程(或者線程)才能引發的事件,那么這組進程(或者線程)就是死鎖的

死鎖出現的情況舉例

(1)線程自鎖,自己將自己鎖住

當進程(線程)第一次訪問一個資源時,對該資源進行加鎖;如果該進程(線程)又對該資源試圖使用而進行加鎖時,由于鎖之前已被自己加上,便會等待鎖的釋放。這就永遠處于掛起狀態了,便產生了死鎖。

(2)多個線程搶占資源

例如當線程A獲得資源1時,線程B獲得資源2時;然后此時,線程A又對2資源進行請求,線程B又對1進行請求,這樣線程A,B都將等待另一個線程釋放資源,于是線程A,B又永遠處于掛起狀態了,這又是死鎖產生的一種情形。

系統中資源的分類

<1>按照重用和消耗類型

(1)可重用資源

特點:

可以讓用戶多次使用的資源

性質:

1、每一個資源只可以讓一個進程(或者線程)進行占用,不可以讓多個進程(或者線程)共享

2、使用方法:請求資源---使用資源---釋放資源

3、系統中每一個可重用資源中的數目是相對固定的,在進程(或者線程)運行期間不可以進行刪除和創建

(2)可消耗資源

特點:

在運行期間創建和消耗

性質:

1、每一類可消耗的單元資源數目是變化的,可以為0

2、進程(或線程)在運行過程中可以不斷的創建可消耗性資源的單元,將它們放入該資源類的緩沖區中,用來增加該資源類的單元數目。

3、進程(或線程)在運行過程中可請求若干個可消耗性資源,用于自身的消耗不再將它們返回給該資源類中。

4、可消耗性資源通常是由生產者進程(或線程)創建,由消費者進程(或線程)消耗。

<1>按照是否可以搶占類型

(1)不可搶占資源

當一個進程(或者線程)占用一個資源時,其他資源必須等到該資源進行釋放才可以使用。

例如打印機和磁帶

(2)可搶占資源

當一個進程(或者線程)占用一個資源時,其他進程(或者線程)、或系統可以對該資源進行搶占。

例如內存和CPU

死鎖產生的必要條件

(1)互斥條件,資源在同一時刻只能由一個進程或者線程進行占用

(2)請求和保持,一個進程或者線程占用著一定數量的資源(至少一個),但又發出了新的資源請求,而新的資源此刻被其他進程或者線程占用著

(3)不可搶占資源,進程或線程在使用完占用的資源前,不可以被其他進程或者線程搶占

(4)循環等待,發生死鎖時,必然存在死鎖鏈

引起死鎖的原因

(1)競爭不可搶占資源

假設系統中擁有兩個進程p1和p2,它們都準備寫兩個文件F1和F2。

而這兩者都屬于可重用和不可搶占性資源。

這種情況下,如果進程p1在打開f1的同時,p2進程打開f2文件,當p1想打開f2時由于f2已結被占用而阻塞,當p2想打開f1時由于f1已結被占用而阻塞,此時就會無線等待下去,形成死鎖。

(2)競爭可消耗資源

我們假設:系統中擁有三個進程p1、p2和p3以及三個可消耗資源m1、m2、m3。

進程p1一方面產生消息m1,將其發送給p2,另一方面要從p3接收消息m3。

而進程p2一方面產生消息m2,將其發送給p3,另一方面要從p1接收消息m1。

類似的,進程p3一方面產生消息m3,將其發送給p1,另一方面要從p2接收消息m2。

這種情況下,如果三個進程都先發送自己產生的消息后接收別人發來的消息,則可以順利的運行下去不會產生死鎖。

但要是三個進程都先接收別人的消息而不產生消息則會永遠等待下去,便會產生死鎖。

(3)進程推進順序不當產生死鎖

假設兩個進程p1和p2,若p1保持了資源r1,p2保持了資源r2,則系統處于不安全狀態,因為這兩個進程再向前推進,便可能發生死鎖。

例如,當P1運行到P1:Request(R2)時,將因R2已被P2占用而阻塞;

當P2運行到P2:Request(R1)時,也將因R1已被P1占用而阻塞,于是發生進程死鎖。

處理死鎖的辦法

(1)預防死鎖

具體方法:破壞死鎖必要條件中的一個或者多個

注意:互斥是必要條件,不能破壞,否則將造成不可再現性

(2)避免死鎖

具體方法:在資源分配過程中,防止系統進入不安全的區域

(3)檢測死鎖

具體方法:通過檢測機制發現死鎖,并可以采取適當措施解決死鎖

(4)解除死鎖

具體方法:當檢測機制發現死鎖后,采用相應的算法解決它

利用銀行家算法解決死鎖

1、在銀行家算法中,主要的數據結構

(1)可利用資源向量Available[m]。m為系統中的資源種類數,如果向量Available[j] = K,則表示系統中Rj類資源由K個。

(2)最大需求矩陣Max[n][m]。m為系統中的資源種類數,n為系統中正在運行的進程(線程)數,如果Max[i][j] = K,則表示進程i需要Rj類資源的最大數目為K個。

(3)分配矩陣Allocation[n][m]。m為系統中的資源種類數,n為系統中正在運行的進程(線程)數,如果Allocation[i][j] = K,則表示進程i當前已分得Rj類資源的數目為K個。

(4)需求矩陣Need[n][m]。m為系統中的資源種類數,n為系統中正在運行的進程(線程)數,如果Need[i][j] = K,則表示進程i還需要Rj類資源K個。

以上三個矩陣間的關系:

Need[i][j] = Max[i][j] - Allocation[i][j]

2、銀行家算法的具體步驟

設Request( i)是進程Pi的請求向量,如果Request(i) [j] = K,表示進程Pi需要K個Rj類型的資源。

(1)如果Request(i) [j] <= Need[i][j],轉向步驟(2)。

(2)如果Request(i) [j] <= Available[j] ,轉向步驟(3)。

(3)系統嘗試著把資源分給進程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)系統執行安全性算法,檢查此次資源分配后系統是否處于安全狀態。

3、銀行家算法中的安全性

(1)設置兩個向量:

1、工作向量Work[m],它表示系統可提供給進程繼續運行所需要的各類資源數目,初始值Work = Available。

2、Finish:它表示系統是否有足夠的資源分配給進程,使其運行完成。開始時Finish[i] = false,當有足夠的資源分配給進程時Finish[i] = true。

(2)從進程(線程)集合中找到一個能滿足下述條件的進程(線程)。

1、Finish[i] = false

2、Need[i][j] <= Work[j],如果找到轉到步驟3》,沒找到轉到步驟4》。

3、Work[j] = Work[j] + Allocation[i][j] ;

Finish[i] = true;

go to step 2;

4、如果所有進程(線程)的Finish[i] = true都滿足,表示系統處于安全狀態,反之系統處于不安全狀態。

總結

以上是生活随笔為你收集整理的linux中死锁的概念,【Linux】死锁概念总结的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。