計(jì)算機(jī)系統(tǒng)中的死鎖:
創(chuàng)新互聯(lián)建站長期為成百上千家客戶提供的網(wǎng)站建設(shè)服務(wù),團(tuán)隊(duì)從業(yè)經(jīng)驗(yàn)10年,關(guān)注不同地域、不同群體,并針對不同對象提供差異化的產(chǎn)品和服務(wù);打造開放共贏平臺,與合作伙伴共同營造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為陽朔企業(yè)提供專業(yè)的成都做網(wǎng)站、成都網(wǎng)站建設(shè)、成都外貿(mào)網(wǎng)站建設(shè),陽朔網(wǎng)站改版等技術(shù)服務(wù)。擁有十余年豐富建站經(jīng)驗(yàn)和眾多成功案例,為您定制開發(fā)。
死鎖的起因,通常源于多個(gè)進(jìn)程對資源的爭奪, 不僅對不可搶占資源進(jìn)行爭奪時(shí)會引起死鎖,而且對可消耗資源進(jìn)行爭奪時(shí),也會引起死鎖。
可搶占資源:
可把系統(tǒng)中的資源分成兩類,一類是可搶占性資源,是指某進(jìn)程在獲得資源后,資源可以被其他進(jìn)程或或系統(tǒng)搶占。例如優(yōu)先級高的高的資源可以搶占優(yōu)先級低的進(jìn)程處理機(jī)。又可以把一個(gè)進(jìn)程從一個(gè)存儲區(qū)轉(zhuǎn)移到另一個(gè)存儲區(qū),在內(nèi)存緊張時(shí),還可將一個(gè)進(jìn)程從內(nèi)存調(diào)出到外存上,即搶占該進(jìn)程的內(nèi)存空間,即cpu和主存均屬于可搶占性資源,對于這類資源是不會引起死鎖的。
不可搶占資源:
另一類資源是不可搶占資源,即一旦系統(tǒng)把某資源分配給進(jìn)程后,就不能將它強(qiáng)行收回,只能在進(jìn)程用完后自行釋放,例如,當(dāng)一個(gè)進(jìn)程已開始刻錄光盤時(shí),如果突然將刻錄機(jī)分配給另一個(gè)進(jìn)程,其結(jié)果必然將損壞正在刻錄的光盤,因此只能等刻好光盤以后由進(jìn)程自己釋放刻錄機(jī),另外磁帶機(jī),打印機(jī)等也屬于不可搶占資源。
1.競爭不可搶占資源引起的死鎖:
通常系統(tǒng)中所有的不可搶占資源其數(shù)量不足以滿足多個(gè)進(jìn)程運(yùn)行的需要,是的進(jìn)程在運(yùn)行過程中,會因爭奪資源陷入僵局,例如,系統(tǒng)中有兩個(gè)進(jìn)程p1,p2,他們都準(zhǔn)備寫兩個(gè)文件f1,f2,這兩者都屬于可重用和不可搶占資源,進(jìn)程p1打開f1,然后再打開文件f,后打開f1,。
兩個(gè)進(jìn)程在并發(fā)執(zhí)行時(shí),如果p1先打開f1和f2,然后p2再打開f1(或f2),由于文件f1或f2,由于f1(f2)已被p1打開,故p2處于會被阻塞,當(dāng)p1寫完文件f1(或f2)而關(guān)閉f1(或f2時(shí),p2就會由阻塞狀態(tài)轉(zhuǎn)為就緒狀態(tài),被調(diào)度執(zhí)行后重新打開文件f1(或f2),在這種情況下,p1和p2都能正常運(yùn)行下去,。
但如果p1打開文件f1的同時(shí),p2去打開f2,每個(gè)進(jìn)程都占有一個(gè)打開的文件, 此時(shí)就可能出現(xiàn)問題,。因?yàn)閜1試圖打開f2,p2試圖打開f1時(shí),這兩個(gè)進(jìn)程就會因都會因文件被打開而被阻塞,他們希望對方關(guān)閉自己所需要的文件,但誰也無法運(yùn)行,因此兩個(gè)進(jìn)程將會無限地等待下去,而形成死鎖。
2.競爭可消耗資源引起的死鎖
在利用消息通信機(jī)制進(jìn)行通信時(shí)引起的死鎖情況,若m1,m2,m3是可消耗性資源,
P1:..send(p2,m1); receive(p3,m3);..
P2:..send(p3,m2); receive(p1,m1);..
P3:..send(p1,m3); receive(p2,m2);..
這三個(gè)進(jìn)程都可將消息發(fā)送給下一個(gè)進(jìn)程,相印地,他們也能夠接受從上一個(gè)進(jìn)程發(fā)送來的消息,因此三個(gè)進(jìn)程可以順利地運(yùn)行下去,而不會發(fā)生死鎖,但若先執(zhí)行receive操作,然后執(zhí)行send操作,即按下述運(yùn)行順序
p1:receive(p3,m3);..P1:..send(p2,m1)
p2:receive(p1,m1);..P2:..send(p3,m2);
p3:receive(p2,m2);....send(p1,m3);
則這三個(gè)進(jìn)程將永久地阻塞他們的receive操作,等待一條永遠(yuǎn)不會發(fā)出的消息,于是發(fā)生 了死鎖。
產(chǎn)生死鎖的必要條件:
(1)互斥條件。進(jìn)程對所分配到的資源進(jìn)行排他性使用,即在一段時(shí)間內(nèi),某資源只能被一個(gè)進(jìn)程占用,如果此時(shí)還有其他進(jìn)程請求該資源,則請求進(jìn)程只能等待,直至占用該資源的進(jìn)程用必釋放。
(2)請求和保持條件。進(jìn)程保持了至少一個(gè)資源,但又提出了新的資源請求,而該資源已被其他進(jìn)程占有,此時(shí)請求進(jìn)程被阻塞,但對自己獲得的資源保持不放。
(3)不可搶占條件。進(jìn)程已獲得的資源在未使用完之前不能被搶占,只能在進(jìn)程使用完時(shí)自己釋放。
(4)循環(huán)等待條件。在發(fā)生死鎖時(shí),必然存在一個(gè)進(jìn)程-資源的循環(huán)鏈,即進(jìn)程集合{p1,p2,p3...pn}中的p0正在等待一個(gè)p1占有的資源,p1正在等待p2占有的資源,...pn正在等待p0占有的資源。
處理死鎖的方法
(1)預(yù)防死鎖
(2)避免死鎖
(3)檢測死鎖
(4)解除死鎖
避免死鎖的方法(銀行家算法)
最具有代表性的避免死鎖的算法是dijkstra的銀行家算法,起這樣的名字是由于該算法原本是為銀行系統(tǒng)設(shè)計(jì)的,以確保在銀行發(fā)放現(xiàn)金貸款時(shí),不會發(fā)生不能滿足所有客戶需要的情況。
1.銀行家算法的數(shù)據(jù)結(jié)構(gòu)
(1)可利用資源向量Available.代表可利用資源的數(shù)目,起初始值是系統(tǒng)中配置該類全部可用資源數(shù)目,其數(shù)值隨隨該類資源的分配和回收動(dòng)態(tài)地變化。
(2)最大需求MAX,這是一個(gè)n*m的矩陣,如果MAX[i,j]=k,則代表進(jìn)程i需要Rj類資源最大數(shù)目為k.
(3)分配矩陣Allcoation。這也是一個(gè)n*m矩陣,它定義了系統(tǒng)中每一類資源當(dāng)前已分配給每一進(jìn)程的資源數(shù),如果Need[i,j]=k,則表示進(jìn)程i還需要Rj類資源方可完成任務(wù)。
Need[i,j]=MAX[i,j]-Allcoation[i,j]
2.銀行家算法
設(shè)Request是進(jìn)程p1的請求向量,如果Request[j]=k,表示進(jìn)程p需要Rj類型的資源,當(dāng)p發(fā)出資源請求后,系統(tǒng)按下述步驟檢查
(1)如果Request[j]<=Need[i,j],便轉(zhuǎn)向步驟2,否則認(rèn)為出錯(cuò),因?yàn)樗枰馁Y源數(shù)已超過它所宣布的最大值。
(2)如果Request[j]<=Available[j],變轉(zhuǎn)向步驟3,否則,表示尚無足夠資源,p1需要等待。
(3)系統(tǒng)試探著把資源分配給進(jìn)程p1,并修改數(shù)據(jù)結(jié)構(gòu)中的數(shù)值。
Available[j]=Available[j]-Request[j]
Allocation[i,j]=Allocation[i,j]+Request[i,j]
Need[i,j]=Need[i,j]-Request[j]
(4)系統(tǒng)執(zhí)行安全性算法,檢查此次資源分配后是否處于安全狀態(tài),若安全,正式分配給進(jìn)程,完成此次分配,否則此次分配失敗,恢復(fù)原來分配資源狀態(tài)。
分享文章:死鎖產(chǎn)生的必要條件,如何有效地避免死鎖
網(wǎng)頁URL:http://m.newbst.com/article36/jheisg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站策劃、、軟件開發(fā)、電子商務(wù)、微信公眾號、外貿(mào)網(wǎng)站建設(shè)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)