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