计算机操作系统——死锁(产生的必要条件与处理死锁的四个关卡)
計(jì)算機(jī)操作系統(tǒng)——死鎖
前言:死鎖:指多個(gè)進(jìn)程因競(jìng)爭(zhēng)共享資源而造成的一種僵局,若無(wú)外力作用,這些進(jìn)程都將永遠(yuǎn)不能再向前推進(jìn)。如果死鎖發(fā)生,會(huì)浪費(fèi)大量的系統(tǒng)資源,甚至?xí)?dǎo)致系統(tǒng)崩潰。
關(guān)于死鎖的結(jié)論:
一、死鎖產(chǎn)生的必要條件
1. 互斥條件
進(jìn)程對(duì)所分配到的資源進(jìn)行排它性使用,即在一段時(shí)間內(nèi),某資源只能被一個(gè)進(jìn)程所占用。如果此時(shí)還有其他進(jìn)程請(qǐng)求該資源,則請(qǐng)求進(jìn)程只能等待,直至占有該資源的進(jìn)程用完并釋放資源。
2. 請(qǐng)求和保持條件
進(jìn)程已經(jīng)保持了至少一個(gè)資源,但又提出新的資源請(qǐng)求,而該進(jìn)程已經(jīng)被其他進(jìn)程占有,此時(shí)進(jìn)行請(qǐng)求的進(jìn)程將被阻塞,進(jìn)入阻塞隊(duì)列,但是對(duì)自己已經(jīng)獲得的資源保持不放。
3. 不可搶占條件
進(jìn)程已獲得的資源在未使用之前不能被搶占,只能在進(jìn)程使用完時(shí)由自己釋放。
4. 循環(huán)等待條件
在發(fā)生死鎖時(shí),必然存在一個(gè)進(jìn)程–資源的循環(huán)鏈,即進(jìn)程集合{P0,P1,…,Pn}中的P0正在等待一個(gè)P1占用的資源,P1正在等待P2占用的資源,…,Pn正在等待已被P0占用的資源。
二、處理死鎖的方法
1. 預(yù)防死鎖
(1)破壞“請(qǐng)求和保持”條件
(2)破壞“不可搶占”條件
可剝奪資源:即當(dāng)某進(jìn)程新的資源未滿足,釋放已占有的資源
(3)破壞“循環(huán)等待”條件
資源有序分配法:系統(tǒng)給每類資源賦予一個(gè)編號(hào),每一個(gè)進(jìn)程按編號(hào)遞增的順序請(qǐng)求資源,釋放則相反。
2. 避免死鎖
利用銀行家算法避免死鎖。Dijkstra的銀行家算法,原本是為銀行系統(tǒng)設(shè)計(jì)的,以確保銀行在發(fā)放現(xiàn)金貸款時(shí),不會(huì)發(fā)生不能滿足所有客戶需要的情況。
為實(shí)現(xiàn)銀行家算法,每一個(gè)新進(jìn)程在進(jìn)系統(tǒng)時(shí),它必須申明在運(yùn)行過(guò)程中,可能需要每種資源類型的最大單元數(shù)目,其數(shù)目不應(yīng)超過(guò)系統(tǒng)所擁有的資源總量。當(dāng)進(jìn)程請(qǐng)求一組資源時(shí),系統(tǒng)必須首先確定是否有足夠的資源分配給該進(jìn)程。如果有,再進(jìn)一步運(yùn)算將資源分配給該進(jìn)程后,是否會(huì)使系統(tǒng)處于不安全狀態(tài)。如果不會(huì),才將資源分配給該進(jìn)程。
銀行家算法中的數(shù)據(jù)結(jié)構(gòu):
(1)可利用資源向量Available
代表可利用的資源數(shù)目。
(2)最大需求矩陣Max
代表各進(jìn)程對(duì)各類資源的最大需求。
(3)分配矩陣Allocation
代表各進(jìn)程當(dāng)前已分配的各類資源數(shù)目。
(4)需求矩陣Need 代表各進(jìn)程尚需要的各類資源數(shù)目。最大需求矩陣減去分配矩陣(Need[i,j] = Max[i,j] - Allocation[i,j])
銀行家算法的過(guò)程:
銀行家算法例題:
3. 檢測(cè)死鎖
為了能對(duì)系統(tǒng)中是否發(fā)生了死鎖進(jìn)行檢測(cè),在系統(tǒng)中必須:保存有關(guān)資源的請(qǐng)求和分配信息;提供一種算法,它利用這些信息來(lái)檢測(cè)系統(tǒng)是否已經(jīng)進(jìn)入死鎖狀態(tài)。
安全性算法:
設(shè)置兩個(gè)向量
a.工作向量Work:提供給進(jìn)程繼續(xù)運(yùn)行所需的各類資源數(shù)目。它含有m個(gè)元素,在安全算法開(kāi)始時(shí)Work = Available
b.Finash:它表示系統(tǒng)是否有足夠的資源分配給進(jìn)程,使之運(yùn)行完成。開(kāi)始時(shí),先令Finish[i] = false;當(dāng)有足夠資源分配給進(jìn)程時(shí),再令Finish[i] = true;
4. 解除死鎖
當(dāng)發(fā)現(xiàn)有進(jìn)程死鎖后,便應(yīng)立即把它從死鎖狀態(tài)中解脫出來(lái),常用的方法:
(1)剝奪(搶占)資源法:從其它進(jìn)程剝奪足夠數(shù)量的資源給死鎖進(jìn)程,以解除死鎖狀態(tài)。
(2)撤銷(終止)進(jìn)程法:可以直接撤銷死鎖進(jìn)程或撤銷代價(jià)最小的進(jìn)程,直至有足夠的資源可用,死鎖狀態(tài)消除為止;所謂的代價(jià)是指優(yōu)先級(jí)、運(yùn)行代價(jià)、進(jìn)程的重要性和價(jià)值等。
(3)進(jìn)程回退法:需要設(shè)置還原點(diǎn),讓一個(gè)或多個(gè)死鎖進(jìn)程回退到足夠避免死鎖的地步。
總結(jié)
以上是生活随笔為你收集整理的计算机操作系统——死锁(产生的必要条件与处理死锁的四个关卡)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Leetcode--字符串压缩
- 下一篇: 计算机操作系统——经典进程的同步问题