操作系统知识——互斥和死锁
銀行家算法
銀行家算法是最有代表性的避免死鎖算法,是Dijkstra提出的。這是由于該算法能用于銀行系統(tǒng)現(xiàn)金貸款的發(fā)放而得名。
我們可以把操作系統(tǒng)看作是銀行家,操作系統(tǒng)管理的資源相當(dāng)于銀行家管理的資金,進程向操作系統(tǒng)請求分配資源相當(dāng)于用戶向銀行家貸款。
關(guān)于安全狀態(tài)的概述
系統(tǒng)處于安全狀態(tài)時,一定不會發(fā)生死鎖;系統(tǒng)處于不安全狀態(tài)時,不一定會發(fā)生死鎖;
(1)安全狀態(tài)
如果存在一個由系統(tǒng)中所有進程構(gòu)成的安全序列P1,…,Pn,則系統(tǒng)處于安全狀態(tài)。安全狀態(tài)一定是沒有死鎖發(fā)生。(2)不安全狀態(tài)
不存在一個安全序列。不安全狀態(tài)不一定導(dǎo)致死鎖。基本思想:
銀行家可以把一定數(shù)量的資金供多個用戶周轉(zhuǎn)使用,為保證資金的安全,銀行家規(guī)定:
- 當(dāng)一個顧客對資金的最大需求量不超過銀行家現(xiàn)有的資金時就可接納該顧客;
- 顧客可以分期貸款,但貸款的總數(shù)不能超過最大需求量;
- 當(dāng)銀行家現(xiàn)有的資金不能滿足顧客尚需的貸款數(shù)額時,對顧客的貸款可推遲支付,但總能使顧客在有限的時間里得到貸款;
當(dāng)顧客得到所需的全部資金后,一定能在有限的時間里歸還所有的資金.
銀行家算法是通過動態(tài)地檢測系統(tǒng)中資源分配情況和進程對資源的需求情況來決定如何分配資源的,在能確保系統(tǒng)處于安全狀態(tài)時才能把資源分配給申請者,從而避免系統(tǒng)發(fā)生死鎖。
相關(guān)的變量:
- Available(可利用資源總數(shù))某類可利用的資源數(shù)目,其初值是系統(tǒng)中所配置的該類全部可用資源數(shù)目。
- Max:某個進程對某類資源的最大需求數(shù)
- Allocation: 某類資源已分配給某進程的資源數(shù)。
- Need:某個進程還需要的各類資源數(shù)。Need= Max-Allocation
銀行家算法描述
設(shè)Request i是進程Pi的申請向量,如果Request i[j]=K,則表示進程Pi需要K個Rj類型的資源。當(dāng)Pi發(fā)出資源請求后,系統(tǒng)按下述步驟進行檢查:
如果Request i[j]<=Need[i,j],便轉(zhuǎn)向步驟2);否則認為出錯,因為它所需要的資源數(shù)已經(jīng)超過它所宣布的最大值。
如果Request i[j]<=Available[i,j],便轉(zhuǎn)向步驟3);否則,表示尚無足夠資源,Pi需等待。
系統(tǒng)試探著把資源分配給進程Pi,并修改下面數(shù)據(jù)結(jié)構(gòu)中的數(shù)值:
1
2
3Available[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)。若安全,才正式將資源分配給進程Pi,以完成本次分配;否則,將本次的試探分配作廢,恢復(fù)原來的資源分配狀態(tài),讓進程Pi等待。
參考:銀行家算法
死鎖的概念
死鎖是指兩個或兩個以上的進程在執(zhí)行過程中,由于競爭資源或者由于彼此通信而造成的一種阻塞的現(xiàn)象,若無外力作用,它們都將無法推進下去。此時稱系統(tǒng)處于死鎖狀態(tài)或系統(tǒng)產(chǎn)生了死鎖,這些永遠在互相等待的進程稱為死鎖進程。
產(chǎn)生死鎖的必要條件
互斥條件:指進程對所分配到的資源進行排它性使用,即在一段時間內(nèi)某資源只由一個進程占用。如果此時還有其它進程請求資源,則請求者只能等待,直至占有資源的進程用畢釋放。
請求和保持條件:指進程已經(jīng)保持至少一個資源,但又提出了新的資源請求,而該資源已被其它進程占有,此時請求進程阻塞,但又對自己已獲得的其它資源保持不放。
不剝奪條件:指進程已獲得的資源,在未使用完之前,不能被剝奪,只能在使用完時由自己釋放。
循環(huán)等待條件:指在發(fā)生死鎖時,必然存在一個進程——資源的環(huán)形鏈,即進程集合{P0,P1,P2,···,Pn}中的P0正在等待一個P1占用的資源;P1正在等待P2占用的資源,……,Pn正在等待已被P0占用的資源。
針對死鎖的解決方案
預(yù)防死鎖。
這是一種較簡單和直觀的事先預(yù)防的方法。方法是通過設(shè)置某些限制條件,去破壞產(chǎn)生死鎖的四個必要條件中的一個或者幾個,來預(yù)防發(fā)生死鎖。預(yù)防死鎖是一種較易實現(xiàn)的方法,已被廣泛使用。但是由于所施加的限制條件往往太嚴(yán)格,可能會導(dǎo)致系統(tǒng)資源利用率和系統(tǒng)吞吐量降低。
預(yù)防死鎖方法(3種):
- 破壞請求和保持條件,如資源靜態(tài)分配法(也稱為預(yù)分配資源)
- 破壞不可搶占條件
- 破壞循環(huán)等待條件
避免死鎖。
該方法同樣是屬于事先預(yù)防的策略,但它并不須事先采取各種限制措施去破壞產(chǎn)生死鎖的的四個必要條件,而是在資源的動態(tài)分配過程中,用某種方法去防止系統(tǒng)進入不安全狀態(tài),從而避免發(fā)生死鎖。如銀行家算法
檢測死鎖。
這種方法并不須事先采取任何限制性措施,也不必檢查系統(tǒng)是否已經(jīng)進入不安全區(qū),此方法允許系統(tǒng)在運行過程中發(fā)生死鎖。但可通過系統(tǒng)所設(shè)置的檢測機構(gòu),及時地檢測出死鎖的發(fā)生,并精確地確定與死鎖有關(guān)的進程和資源,然后采取適當(dāng)措施,從系統(tǒng)中將已發(fā)生的死鎖清除掉。如資源分配圖簡化法。
解除死鎖。
這是與檢測死鎖相配套的一種措施。當(dāng)檢測到系統(tǒng)中已發(fā)生死鎖時,須將進程從死鎖狀態(tài)中解脫出來。常用的實施方法是撤銷或掛起一些進程,以便回收一些資源,再將這些資源分配給已處于阻塞狀態(tài)的進程,使之轉(zhuǎn)為就緒狀態(tài),以繼續(xù)運行。死鎖的檢測和解除措施,有可能使系統(tǒng)獲得較好的資源利用率和吞吐量,但在實現(xiàn)上難度也最大。
死鎖的解除方法(2種):
- 搶占資源,如剝奪資源法。
- 終止(或撤銷)進程。
具體方案:
鏈接:https://www.nowcoder.com/questionTerminal/b8ade2458fe94e59827f8adbf58efe2c
來源:??途W(wǎng)
系統(tǒng)中的資源
- 一類是可剝奪資源,即CPU 和 內(nèi)存 ,是指某進程在獲得這類資源后,該資源可以再被其他進程或系統(tǒng)剝奪。例如,優(yōu)先權(quán)高的進程可以剝奪優(yōu)先權(quán)低的進程的 處理機 。
- 另一類資源是不可剝奪資源,如 磁帶機 、打印機等,當(dāng)系統(tǒng)把這類資源分配給某進程后,再不能強行收回,只能在進程用完后自行釋放。
鏈接:https://www.nowcoder.com/questionTerminal/d7375249214648c6b3b12ce8184efea2
來源:牛客網(wǎng)
互斥
各進程采取互斥的方式,實現(xiàn)共享的資源稱作臨界資源。
信號量機制的引入解決了進程同步的描述問題,但信號量的大量同步操作分散在各個進程中不便于管理,還有可能導(dǎo)致系統(tǒng)死鎖。如:生產(chǎn)者消費者問題中將P、V顛倒可能死鎖。
為此Dijkstra于1971年提出:把所有進程對某一種臨界資源的同步操作都集中起來,構(gòu)成一個所謂的秘書進程。凡要訪問該臨界資源的進程,都需先報告秘書,由秘書來實現(xiàn)諸進程對同一臨界資源的互斥使用。
鏈接:https://www.nowcoder.com/questionTerminal/401d52fe872a4473857f8b795ccc6783
來源:牛客網(wǎng)
總結(jié)
以上是生活随笔為你收集整理的操作系统知识——互斥和死锁的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C++编译错误C2365
- 下一篇: 信用卡到底逾期多少天才会上征信系统?