10 操作系统第二章 进程管理 死锁、死锁的处理策略 银行家算法
文章目錄
- 1 死鎖
- 1.1 死鎖定義
- 1.2 死鎖、饑餓、死循環(huán)的區(qū)別
- 1.3 死鎖產(chǎn)生的必要條件
- 1.4 什么時(shí)候會(huì)發(fā)生死鎖
- 1.5 死鎖的處理策略
- 1.6 死鎖的概念小結(jié)
- 2 死鎖預(yù)防
- 2.1 破壞互斥條件
- 2.2 破壞不剝奪條件
- 2.3 破壞請(qǐng)求和保持條件
- 2.4 破壞循環(huán)等待條件
- 2.5 預(yù)防死鎖小結(jié)
- 3 死鎖避免
- 3.1 安全序列
- 3.2 銀行家算法
- 3.2.1 手動(dòng)實(shí)現(xiàn)銀行家算法
- 3.2.2 銀行家算法描述
- 4 死鎖的檢測(cè)和解除
- 4.1 死鎖的檢測(cè)
- 4.2 死鎖的避免
- 4.3 死鎖的檢測(cè)與避免小結(jié)
1 死鎖
1.1 死鎖定義
產(chǎn)生條件:每個(gè)人都占有一個(gè)資源,同時(shí)又在等待另一個(gè)人手里的資源。發(fā)生“死鎖”
在并發(fā)環(huán)境下,各進(jìn)程因競(jìng)爭(zhēng)資源而造成的一種互相等待對(duì)方手里的資源,導(dǎo)致各進(jìn)程都阻塞,都無(wú)法向前推進(jìn)的現(xiàn)象,這就是“死鎖”。發(fā)生死鎖后若無(wú)外力干涉,這些進(jìn)程都將無(wú)法向前推進(jìn)。
1.2 死鎖、饑餓、死循環(huán)的區(qū)別
1.3 死鎖產(chǎn)生的必要條件
產(chǎn)生死鎖必須同時(shí)滿足一下四個(gè)條件,只要其中任一條件不成立,死鎖就不會(huì)發(fā)生。
注意:
1.4 什么時(shí)候會(huì)發(fā)生死鎖
各進(jìn)程對(duì)不可剝奪的資源(如打印機(jī))的競(jìng)爭(zhēng)可能引起死鎖,對(duì)可剝奪的資源(CPU)的競(jìng)爭(zhēng)是不會(huì)引起死鎖的。
請(qǐng)求和釋放資源的順序不當(dāng),也會(huì)導(dǎo)致死鎖。例如,并發(fā)執(zhí)行的進(jìn)程P1、P2分別申請(qǐng)并占用了資源R1、R2,之后進(jìn)程P1又緊接著申請(qǐng)資源R2,而進(jìn)程P2又申請(qǐng)資源R1,兩者會(huì)因?yàn)樯暾?qǐng)的資源被對(duì)方占有而阻塞,從而發(fā)生死鎖
在生產(chǎn)者-消費(fèi)者問題中,若實(shí)現(xiàn)互斥的P操作在實(shí)現(xiàn)同步的P操作之前,就有可能導(dǎo)致死鎖。(可以把互斥信號(hào)量、同步信號(hào)量也看做是一種抽象的系統(tǒng)資源)
總之,對(duì)不可剝奪資源的不合理分配,可能導(dǎo)致死鎖。
1.5 死鎖的處理策略
1.6 死鎖的概念小結(jié)
2 死鎖預(yù)防
2.1 破壞互斥條件
互斥條件:只有對(duì)必須互斥使用的資源的爭(zhēng)搶才會(huì)導(dǎo)致死鎖。
如果把只能互斥使用的資源改造為允許共享使用,則系統(tǒng)不會(huì)進(jìn)入死鎖狀態(tài)。比如:SPOOLing技術(shù)。 操作系統(tǒng)可以采用SPOOLing 技術(shù)把獨(dú)占設(shè)備在邏輯上改造成共享設(shè)備。比如,用SPOOLing技術(shù)將打印機(jī)改造為共享設(shè)備…
該策略的缺點(diǎn):
并不是所有的資源都可以改造成可共享使用的資源。并且為了系統(tǒng)安全,很多地方還必須保護(hù)這種互斥性。因此,很多時(shí)候都無(wú)法破壞互斥條件。
2.2 破壞不剝奪條件
不剝奪條件:進(jìn)程所獲得的資源在未使用完之前,不能由其他進(jìn)程強(qiáng)行奪走,只能主動(dòng)釋放。
破壞不剝奪條件:
方案一:當(dāng)某個(gè)進(jìn)程請(qǐng)求新的資源得不到滿足時(shí),它必須立即釋放保持的所有資源,待以后需要時(shí)再重新申請(qǐng)。也就是說(shuō),即使某些資源尚未使用完,也需要主動(dòng)釋放,從而破壞了不可剝奪條件。
方案二:當(dāng)某個(gè)進(jìn)程需要的資源被其他進(jìn)程所占有的時(shí)候,可以由操作系統(tǒng)協(xié)助,將想要的資源強(qiáng)行剝奪。這種方式一般需要考慮各進(jìn)程的優(yōu)先級(jí)(比如:剝奪調(diào)度方式,就是將處理機(jī)資源強(qiáng)行剝奪給優(yōu)先級(jí)更高的進(jìn)程使用)
該策略的缺點(diǎn):
2.3 破壞請(qǐng)求和保持條件
請(qǐng)求和保持條件:進(jìn)程已經(jīng)保持了至少一個(gè)資源,但又提出了新的資源請(qǐng)求,而該資源又被其他進(jìn)程占有,此時(shí)請(qǐng)求進(jìn)程被阻塞,但又對(duì)自己已有的資源保持不放。
可以采用靜態(tài)分配方法,即進(jìn)程在運(yùn)行前一次申請(qǐng)完它所需要的全部資源,在它的資源未滿足前, 不讓它投入運(yùn)行。一旦投入運(yùn)行后,這些資源就一直歸它所有,該進(jìn)程就不會(huì)再請(qǐng)求別的任何資源了。
該策略實(shí)現(xiàn)起來(lái)簡(jiǎn)單,但也有明顯的缺點(diǎn): 有些資源可能只需要用很短的時(shí)間,因此如果進(jìn)程的整個(gè)運(yùn)行期間都一直保持著所有資源,就會(huì)造成嚴(yán)重的資源浪費(fèi),資源利用率極低。另外,該策略也有可能導(dǎo)致某些進(jìn)程饑餓。
2.4 破壞循環(huán)等待條件
循環(huán)等待條件:存在一種進(jìn)程資源的循環(huán)等待鏈,鏈中的每一個(gè)進(jìn)程已獲得的資源同時(shí)被下一個(gè)進(jìn)程所請(qǐng)求。
可采用順序資源分配法。首先給系統(tǒng)中的資源編號(hào),規(guī)定每個(gè)進(jìn)程必須按編號(hào)遞增的順序請(qǐng)求資源, 同類資源(即編號(hào)相同的資源)一次申請(qǐng)完。
原理分析:一個(gè)進(jìn)程只有已占有小編號(hào)的資源時(shí),才有資格申請(qǐng)更大編號(hào)的資源。按此規(guī)則,已持有大編號(hào)資源的進(jìn)程不可能逆向地回來(lái)申請(qǐng)小編號(hào)的資源,從而就不會(huì)產(chǎn)生循環(huán)等待的現(xiàn)象。
該策略的缺點(diǎn):
2.5 預(yù)防死鎖小結(jié)
3 死鎖避免
3.1 安全序列
所謂安全序列,就是指如果系統(tǒng)按照這種序列分配資源,則每個(gè)進(jìn)程都能順利完成。只要能找出一個(gè)安全序列,系統(tǒng)就是安全狀態(tài)。當(dāng)然,安全序列可能有多個(gè)。
如果分配了資源之后,系統(tǒng)中找不出任何一個(gè)安全序列,系統(tǒng)就進(jìn)入了不安全狀態(tài)。這就意味著之后可能所有進(jìn)程都無(wú)法順利的執(zhí)行下去。當(dāng)然,如果有進(jìn)程提前歸還了一些資源,那系統(tǒng)也有可能重新回到安全狀態(tài),不過(guò)我們?cè)诜峙滟Y源之前總是要考慮到最壞的情況。
如果系統(tǒng)處于安全狀態(tài),就一定不會(huì)發(fā)生死鎖,如果系統(tǒng)進(jìn)入不安全,就可能發(fā)生死鎖(處于不安全狀態(tài)未必就是發(fā)生了死鎖,但發(fā)生死鎖時(shí)一定是在不安全狀態(tài))
因此可以在資源分配之前預(yù)先判斷這次分配是否會(huì)導(dǎo)致系統(tǒng)進(jìn)入不安全狀態(tài),以此決定是否答應(yīng)資源分配請(qǐng)求。這也是“銀行家算法”的核心思想。
3.2 銀行家算法
核心思想:在進(jìn)程提出資源申請(qǐng)時(shí),先預(yù)判此次分配是否會(huì)導(dǎo)致系統(tǒng)進(jìn)入不安全狀態(tài)。如果會(huì)進(jìn)入不安全狀態(tài),就暫時(shí)不答應(yīng)這次請(qǐng)求,讓該進(jìn)程先阻塞等待。
思考:在計(jì)算機(jī)系統(tǒng)中會(huì)有多種多樣的資源,如何用銀行家算法多種資源的分配情況呢?
3.2.1 手動(dòng)實(shí)現(xiàn)銀行家算法
可以把多種資源拓展為多維的向量。比如:系統(tǒng)中有5個(gè)進(jìn)程PO~P4,3種資源RO~R2,初始數(shù)量為(10,5,7),則某一時(shí)刻的情況可表示如下:
| P0 | (7,5,3) | (0,1,0) |
| P1 | (3,2,2) | (2,0,0) |
| P2 | (9,0,2) | (3,0,2) |
| P3 | (2,2,2) | (2,1,1) |
| P4 | (4,3,3) | (0,0,2) |
此時(shí)總共已分配(7,2,5),還剩余(3,3,2)
可把最大需求、已分配的數(shù)據(jù)看作矩陣,兩矩陣相減,就可算出各進(jìn)程最多還需要多少資源了
| P0 | (7,5,3) | (0,1,0) | (7,4,3) |
| P1 | (3,2,2) | (2,0,0) | (1,2,2) |
| P2 | (9,0,2) | (3,0,2) | (6,0,0) |
| P3 | (2,2,2) | (2,1,1) | (0,1,1) |
| P4 | (4,3,3) | (0,0,2) | (4,3,1) |
思考:此時(shí)系統(tǒng)是否處于安全狀態(tài)?
思路:嘗試找出一個(gè)安全序列…
(2,1,1)+(5,3,2)=(7,4,3)
(7,5,3)>(6,0,0),此時(shí)P2滿足需求,加入安全序列,等P2結(jié)束了就會(huì)歸還資源。于是,資源數(shù)就可以增加到(3,0,2)+(7,5,3)=(10,5,5)
(10,5,3)>(4,3,0),此時(shí)P4滿足需求,加入安全序列,等P4結(jié)束了就會(huì)歸還資源。于是,資源數(shù)就可以增加到(0,0,2)+(10,5,3)=(10,5,7),恢復(fù)到原來(lái)初始數(shù)量。
以此類推,共五次循環(huán)檢查即可將5個(gè)進(jìn)程都加入安全序列中,最終可得一個(gè)安全序列。本次安全系列即:P1、P3、P0、P2、P4。
該算法稱為安全性算法,可以很方便地用代碼實(shí)現(xiàn)以上流程,每一輪檢查都從編號(hào)較小的進(jìn)程開始檢查。
實(shí)際做題時(shí)可以更快速的得到安全序列。
資源總數(shù)(10,5,7),剩余可用資源(10,5,7)-(7,2,5)=(3,3,2)
| P0 | (7,5,3) | (0,1,0) | (7,4,3) |
| P1 | (3,2,2) | (2,0,0) | (1,2,2) |
| P2 | (9,0,2) | (3,0,2) | (6,0,0) |
| P3 | (2,2,2) | (2,1,1) | (0,1,1) |
| P4 | (4,3,3) | (0,0,2) | (4,3,1) |
經(jīng)對(duì)比發(fā)現(xiàn),(3,3,2)可滿足P1、P3,說(shuō)明無(wú)論如何,這兩個(gè)進(jìn)程的資源需求一定是可以依次被滿足的,因此P1、P3一定可以順利的執(zhí)行完,并歸還資源。可把P1、P3先加入安全序列。
(2,0,0)+(2,1,1)+(3,3,2)=(7,4,3)
去除P1、P3,分析PO、P2、P4
資源總數(shù)(10,5,7),剩余可用資源(7,4,3)
| P0 | (7,5,3) | (0,1,0) | (7,4,3) |
| P2 | (9,0,2) | (3,0,2) | (6,0,0) |
| P4 | (4,3,3) | (0,0,2) | (4,3,1) |
剩下的PO、P2、P4都可被滿足。同理,這些進(jìn)程都可以加入安全序列。
于是,5個(gè)進(jìn)程全部加入安全序列,說(shuō)明此時(shí)系統(tǒng)處于安全狀態(tài),暫不可能發(fā)生死鎖。
3.2.2 銀行家算法描述
假設(shè)系統(tǒng)中有n個(gè)進(jìn)程,m種資源
每個(gè)進(jìn)程在運(yùn)行前先聲明對(duì)各種資源的最大需求數(shù),則可用一個(gè)n*m的矩陣(可用二維數(shù)組實(shí)現(xiàn))表示所有進(jìn)程對(duì)各種資源的最大需求數(shù)。
不妨稱為最大需求矩陣Max,Max[i,j]=K表示進(jìn)程Pi最多需要K個(gè)資源Rj。同理,系統(tǒng)可以用一個(gè)n*m的分配矩陣Allocation表示對(duì)所有進(jìn)程的資源分配情況。Max-Allocation= Need矩陣,表示各進(jìn)程最多還需要多少各類資源。
另外,還要用一個(gè)長(zhǎng)度為m的一維數(shù)組Available表示當(dāng)前系統(tǒng)中還有多少可用資源。
某進(jìn)程Pi向系統(tǒng)申請(qǐng)資源,可用一個(gè)長(zhǎng)度為m的一維數(shù)組Request;表示本次申請(qǐng)的各種資源量。
可用銀行家算法預(yù)判本次分配是否會(huì)導(dǎo)致系統(tǒng)進(jìn)入不安全狀態(tài):
銀行家算法數(shù)據(jù)結(jié)構(gòu):
- 長(zhǎng)度為m的一維數(shù)組Available表示還有多少可用資源
- n*m矩陣Max表示各進(jìn)程對(duì)資源的最大需求數(shù)
- n*m矩陣Allocation表示已經(jīng)給各進(jìn)程分配了多少資源
- Max-Allocation=Need矩陣表示各進(jìn)程最多還需要多少資源
- 用長(zhǎng)度為m的一位數(shù)組Request表示進(jìn)程此次申請(qǐng)的各種資源數(shù)
銀行家算法步驟:
安全性算法步驟:
系統(tǒng)處于不安全狀態(tài)未必死鎖,但死鎖時(shí)一定處于不安全狀態(tài)。系統(tǒng)處于安全狀態(tài)一定不會(huì)死鎖。
4 死鎖的檢測(cè)和解除
4.1 死鎖的檢測(cè)
為了能對(duì)系統(tǒng)是否已發(fā)生了死鎖進(jìn)行檢測(cè),必須:
R2資源有2個(gè),R1資源有3個(gè),P1進(jìn)程請(qǐng)求1個(gè)R2資源,P2進(jìn)程請(qǐng)求1個(gè)R1資源,R1給P1分配了兩個(gè)資源,R1給P2進(jìn)程分配了1個(gè)資源,R2給P2進(jìn)程分配了兩個(gè)資源
以下就是圖的表示:
如何由圖形判斷系統(tǒng)是否處于死鎖狀態(tài)?
上圖中P1進(jìn)程僅請(qǐng)求1個(gè)R2資源,而R2資源只分配出去了1個(gè),而R2資源有2個(gè),所以還有一個(gè)空閑可分配給P1,P1進(jìn)程此次請(qǐng)求可以被滿足,因此不會(huì)被阻塞,可以順利執(zhí)行下去;
P2進(jìn)程請(qǐng)求1個(gè)R1資源,而R1的3個(gè)資源都被分配出去了,無(wú)空閑可分配給P2,P1進(jìn)程此次請(qǐng)求不可以被滿足,因此會(huì)被阻塞,無(wú)法順利執(zhí)行下去。
P1執(zhí)行完畢,把所有資源歸還系統(tǒng),不會(huì)在申請(qǐng)資源,可以將P1進(jìn)程所連的邊抹去
此時(shí)P2可以申請(qǐng)1個(gè)R1資源,P2進(jìn)程被喚醒執(zhí)行,執(zhí)行完畢后,歸還系統(tǒng)資源,并且不對(duì)任何一種資源提出請(qǐng)求,將P2進(jìn)程所連的邊抹去
如果最終不能消除所有邊,那么此時(shí)就是發(fā)生了死鎖
P1要申請(qǐng)2個(gè)R2資源,此時(shí)R2無(wú)空閑可分配,P2要請(qǐng)求1個(gè)R1資源,此時(shí)R1無(wú)空閑可分配,P3可順利執(zhí)行,執(zhí)行完畢歸還1個(gè)R2,此時(shí)R2有1個(gè)空閑資源,但P1申請(qǐng)仍然阻塞,同樣P2也被阻塞
最終還連著邊的那些進(jìn)程就是處于死鎖狀態(tài)的進(jìn)程。
所以P3進(jìn)程不是死鎖進(jìn)程,P1、P2進(jìn)程是死鎖進(jìn)程
檢測(cè)死鎖的算法:
(即找出一條有向邊與它相連,且該向邊對(duì)應(yīng)資源的申請(qǐng)數(shù)量小于等于系統(tǒng)中已有空閑資源數(shù)量。
如下圖中,R1沒有空閑資源,R2有 1個(gè)空閑資源。若所有的連接該進(jìn)程的邊均滿足上述條件,則這個(gè)進(jìn)程能繼續(xù)運(yùn)行直至完成,然后釋放它所占有的所有資源)。消去它所有的請(qǐng)求邊和分配邊,使之稱為孤立的結(jié)點(diǎn)。在下圖中, P1是滿足這一條件的進(jìn)程結(jié)點(diǎn),于是將P1的所有邊消去。
4.2 死鎖的避免
一旦檢測(cè)出死鎖的發(fā)生,就應(yīng)該立即解除死鎖。
并不是系統(tǒng)中所有的進(jìn)程都是死鎖狀態(tài),用死鎖檢測(cè)算法化簡(jiǎn)資源分配圖后,還連著邊的那些進(jìn)程就是死鎖進(jìn)程
解除死鎖的主要方法有:
如何決定對(duì)哪一進(jìn)程實(shí)現(xiàn)以上3個(gè)方法解除死鎖呢?
從以下5個(gè)角度考慮:
4.3 死鎖的檢測(cè)與避免小結(jié)
總結(jié)
以上是生活随笔為你收集整理的10 操作系统第二章 进程管理 死锁、死锁的处理策略 银行家算法的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ASP.NET MVC教程六:两个配置文
- 下一篇: 采用优化卷积神经网络的红外目标识别系统