作業系統 併發:死鎖和飢餓 複習題&練習題&總結
Part1 複習題:
6.1可重用資源:處理器、I/O通道,貯存和輔存,裝置以及諸如檔案,資料庫和訊號量之類的資料結構。
可消費資源:中斷、訊號、訊息和I/O緩衝區的資訊。
6.2產生死鎖的3個必要條件:互斥、佔有且等待、非搶佔。
6.3產生死鎖的4個條件:互斥、佔有且等待、非搶佔、迴圈等待。
6.4預防佔有等待的條件:可以要求程序一次性的請求所有需要的資源,並且阻塞這個資源直到所有請求都同時滿足。
6.5防止無搶佔條件的兩種方法:
第一種,如果佔有某些資源的一個程序進行進一步資源請求被拒絕,則該程序必須釋放它最初佔用的資源,如果有必要,可再次請求這些資源和另外的資源。
第二種,如果一個程序請求當前被另一個程序佔有的一個資源,則作業系統可以搶佔另一個程序,要求它釋放資源。
6.6 預防迴圈等待的條件:
可以通過定義資源型別的線性順序來預防。如果一個程序已經分配到R型別的資源,那麼它接下來請求的資源只能是那些排在R類之後的資源型別。
6.7死鎖避免、檢測和預防之間的區別:
死鎖預防是通過間接的限制3種死鎖必要條件的至少一個或者是直接地限制迴圈等待的發生來避免死鎖的出現。 死鎖避免允許可能出現的必要條件發生,但是採取措施確保不會出現死鎖的情況。
死鎖檢測允許資源自由分配,採取週期性的措施來發現並處理可能存在的死鎖情況。
Part 2 練習題
6.1舉例說明死鎖的4個條件:
互斥:同一時刻只有一輛車可以佔有一個十字路口象限。
佔有且等待:沒有車可以倒退;在十字路口的每輛車都要等待直到它前面的象限是空的。
非搶佔:沒有汽車被允許擠開其他車輛。
迴圈等待:每輛汽車都在等待一個此時已經被其他車佔領的十字路口象限。
6.2對於圖6.1:
死鎖預防-互斥:。。。
死鎖預防-佔有且等待:每輛車都順次需要佔用兩個象限的資源。任意3輛車同時出發時不會出現死鎖(但容易發生事故,O(∩_∩)O~)。在車輛速度相同的情況下,3輛車同時出發不會導致死鎖和資源申請被拒。
死鎖預防-不可搶佔:若執行上述預防佔有且等待的方法,第四輛車出發前,接下來申請其首次申請資源的車輛需搶佔該資源,否則發生死鎖。
死鎖避免:
資源總量:[a,c,b,d]=[1,1,1,1];程序i對資源j的需求:如圖Cij=
(1)程序啟動拒絕:每種資源總的請求量都是2,若4個程序同時請求資源,則不滿足關係式Cij<=Ri等。
Rj=Vj+∑Aij,即對所有j 所有資源或者可用,或者已近被分配。
Cij<=Ri,對所有i,j 任何一個程序對任何一種資源的請求都不能超過系統中該種資源的總量。
Aij<=Cij,分配給任何一個程序的任何一種資源都不會超過該程序最初宣告的此資源的最大請求個數。
滿足以上條件,且 條件滿足時,啟動新程序Pn+1,即只有所有當前程序的最大請求加上新的程序請求可以滿足可以滿足時,才會啟動該程序。
但是該條件很難最優,對於該題十字路口,每次只允許平行車道上的兩輛車同行則滿足要求,但不是最優結果。(最優解不一定是最適合的解)
(2)資源分配拒絕(銀行家演算法)
安全狀態:至少有一個資源分配序列不會導致死鎖。啟動一個程序只需要分配其所需的第一資源。至少有一輛車分配到所有所需資源即可保持無死鎖。
6.3 圖6.2描述
1.Q獲得B和A,然後釋放B和A。當P恢復執行時,獲得全部資源。
2.Q獲得B和A,P阻塞在對A的請求上;Q釋放B和A。當P恢復時,可以獲得全部資源。
3.Q獲得B,然後P獲得A再釋放A,Q獲得A後釋放所有資源。
。。。。。。對稱
6.4 (1)死鎖產生的四個必要條件:互斥,佔有且等待,不可搶佔,迴圈等待。
(2)十字路口:
6.6死鎖檢測的應用:
W=(2 1 0 0) ;Mark P3: W = (2 1 0 0)+(0 1 2 0)=(2 2 2 0)
Mark P2: W = (2 2 2 0)+(2 0 0 1)=(4 2 2 1)
Mark P1: W = (4 2 2 1)+(0 0 1 0)=(4 2 3 1) 沒有死鎖
總結:
1.死鎖基本概念:
(1)理解:
以下內容為轉載:原文出自新浪愛問
作業系統中有若干程序併發執行, 它們不斷申請、使用、釋放系統資源,雖然系統的進
程協調、通訊機構會對它們進行控制,但也可能出現若干程序都相互等待對方釋放資源才能
繼續執行,否則就阻塞的情況。此時,若不借助外界因素, 誰也不能釋放資源, 誰也不能解
除阻塞狀態。根據這樣的情況,作業系統中的死鎖被定義為系統中兩個或者多個程序無限期
地等待永遠不會發生的條件,系統處於停滯狀態,這就是死鎖。
產生死鎖的原因主要是:
(1) 因為系統資源不足。
(2) 程序執行推進的順序不合適。
(3) 資源分配不當等。
如果系統資源充足, 程序的資源請求都能夠得到滿足,死鎖出現的可能性就很低, 否則
就會因爭奪有限的資源而陷入死鎖。其次,程序執行推進順序與速度不同,也可能產生死鎖。
產生死鎖的四個必要條件:
(1) 互斥條件:一個資源每次只能被一個程序使用。
(2) 請求與保持條件:一個程序因請求資源而阻塞時,對已獲得的資源保持不放。
(3) 不剝奪條件:程序已獲得的資源,在末使用完之前,不能強行剝奪。
(4) 迴圈等待條件:若干程序之間形成一種頭尾相接的迴圈等待資源關係。
這四個條件是死鎖的必要條件, 只要系統發生死鎖, 這些條件必然成立, 而只要上述條件之
一不滿足,就不會發生死鎖。
死鎖的解除與預防:
理解了死鎖的原因, 尤其是產生死鎖的四個必要條件,就可以最大可能地避免、預防和
解除死鎖。所以, 在系統設計、程序排程等方面注意如何不讓這四個必要條件成立, 如何確
定資源的合理分配演算法, 避免程序永久佔據系統資源。此外, 也要防止程序在處於等待狀態
的情況下佔用資源。因此,對資源的分配要給予合理的規劃。
(2)死鎖預防&死鎖避免&死鎖檢測
死鎖預防:間接死鎖預防(阻止必要條件中任何一個的發生) & 直接死鎖預防(防止迴圈等待)
死鎖避免:允許必要條件發生,但通過選擇防止到達死鎖點,較預防允許更多併發。
程序啟動拒絕 & 資源分配拒絕(銀行家演算法)。
優點:無需搶佔、回滾。缺點:需宣告最大資源;程序需無關;分配資源數目固定;佔有資源不退出。
死鎖檢測:
作業系統週期性地執行演算法檢測迴圈等待條件。如圖:
由於P4沒有以分配的資源,標記P4--->臨時向量W=(0 0 0 0 1)-->程序P3的請求小於或等於W,標記P3,令W=W+(0 0 0 1 0)=(0 0 0 1 1)--->沒有其他未標記的程序在Q中小於或等於W,因此終止演算法。 P1和P2沒有標記,表示這兩個程序死鎖。
死鎖恢復:1)取消所有死鎖程序。2)回滾和重啟。3)基於最小代價取消死鎖程序,檢測。
2兩個演算法:
(1)銀行家演算法:死鎖避免--資源分配拒絕
以下來自維基:
Allocation Max Available ABCD ABCD ABCD P1 0014 0656 1520 P2 1432 1942 P3 1354 1356 P4 1000 1750
我們會看到一個資源分配表,要判斷是否為安全狀態,首先先找出它的Need,Need即Max(最多需要多少資源)減去Allocation(原本已經分配出去的資源),計算結果如下:
NEED ABCD 0642 0510 0002 0750
然後加一個全都為false的欄位
FINISH false false false false
接下來找出need比available小的
NEED Available ABCD ABCD 0642 1520 0510<- 0002 0750
P2的需求小於能用的,所以配置給他再回收
NEED Available ABCD ABCD 0642 1520 0000 +1432 0002------- 0750 2952
此時P2 FINISH的false要改成true(己完成)
FINISH false true false false
接下來繼續往下找,發現P3的需求為0002,小於能用的2952,所以資源配置給他再回收
NEED Available ABCD A B C D 0642 2 9 5 2 0000 +1 3 5 4 0002---------- 0750 3 12 10 6
同樣的將P3的false改成true
FINISH false true true false
依此類推,做完P4→P1,當全部的FINISH都變成true時,就是安全狀態。
P - 程序的集合;Mp - 程序p的最大的請求數目;Cp - 程序p當前被分配的資源;A - 當前可用的資源
while (P != ∅) {
found = FALSE;
foreach (p ∈ P) {
if (Mp − Cp ≤ A) {
/* p可以獲得他所需的資源。假設他得到資源後執行;執行終止,並釋放所擁有的資源。*/
A = A + Cp ;
P = P − {p};
found = TRUE;
}
}
if (! found) return FAIL;
}
return OK;
(2)哲學家就餐--解決死鎖問題的其他方案
服務生解法
一個簡單的解法是引入一個餐廳服務生,哲學家必須經過他的允許才能拿起餐叉。因為服務生知道哪隻餐叉正在使用,所以他能夠作出判斷避免死鎖。
為了演示這種解法,假設哲學家依次標號為A至E。如果A和C在吃東西,則有四隻餐叉在使用中。B坐在A和C之間,所以兩隻餐叉都無法使用,而D和E之間有一隻空餘的餐叉。假設這時D想要吃東西。如果他拿起了第五隻餐叉,就有可能發生死鎖。相反,如果他徵求服務生同意,服務生會讓他等待。這樣,我們就能保證下次當兩把餐叉空餘出來時,一定有一位哲學家可以成功的得到一對餐叉,從而避免了死鎖。
資源分級解法
另一個簡單的解法是為資源(這裡是餐叉)分配一個偏序或者分級的關係,並約定所有資源都按照這種順序獲取,按相反順序釋放,而且保證不會有兩個無關資源同時被同一項工作所需要。在哲學家就餐問題中,資源(餐叉)按照某種規則編號為1至5,每一個工作單元(哲學家)總是先拿起左右兩邊編號較低的餐叉,再拿編號較高的。用完餐叉後,他總是先放下編號較高的餐叉,再放下編號較低的。在這種情況下,當四位哲學家同時拿起他們手邊編號較低的餐叉時,只有編號最高的餐叉留在桌上,從而第五位哲學家就不能使用任何一隻餐叉了。而且,只有一位哲學家能使用最高編號的餐叉,所以他能使用兩隻餐叉用餐。當他吃完後,他會先放下編號最高的餐叉,再放下編號較低的餐叉,從而讓另一位哲學家拿起後邊的這隻開始吃東西。
儘管資源分級能避免死鎖,但這種策略並不總是實用的,特別是當所需資源的列表並不是事先知道的時候。例如,假設一個工作單元拿著資源3和5,並決定需要資源2,則必須先要釋放5,之後釋放3,才能得到2,之後必須重新按順序獲取3和5。對需要訪問大量資料庫記錄的計算機程式來說,如果需要先釋放高編號的記錄才能訪問新的記錄,那麼執行效率就不會高,因此這種方法在這裡並不實用。
這種方法經常是實際電腦科學問題中最實用的解法,通過為分級鎖指定常量,強制獲得鎖的順序,就可以解決這個問題。
Chandy/Misra解法
1984年,K. Mani Chandy和J. Misra提出了哲學家就餐問題的另一個解法,允許任意的使用者(編號P1, ..., Pn)爭用任意數量的資源。與資源分級解法不同的是,這裡編號可以是任意的。
- 對每一對競爭一個資源的哲學家,新拿一個餐叉,給編號較低的哲學家。每隻餐叉都是“乾淨的”或者“髒的”。最初,所有的餐叉都是髒的。
- 當一位哲學家要使用資源(也就是要吃東西)時,他必須從與他競爭的鄰居那裡得到。對每隻他當前沒有的餐叉,他都發送一個請求。
- 當擁有餐叉的哲學家收到請求時,如果餐叉是乾淨的,那麼他繼續留著,否則就擦乾淨並交出餐叉。
- 當某個哲學家吃東西后,他的餐叉就變髒了。如果另一個哲學家之前請求過其中的餐叉,那他就擦乾淨並交出餐叉。
這個解法允許很大的並行性,適用於任意大的問題。