資源:需要排他性使用的物件怕;隨著時間推移,必須獲得、使用以及釋放的任何東西
可搶占資源:可以從擁有的程序中搶占而不會產生任何***,例如、儲存器(記憶體)
死鎖與不可搶占資源有關,有關可搶占資源的潛在死鎖通常可通過在程序之間重新分配資源而化解。
死鎖:如果一組程序中的每乙個程序都在等待僅由該組程序中的其它程序才能引發的事件,那麼該組程序是死鎖的。
產生死鎖的原因:
(1)競爭
不可搶占性
資源。(2)
競爭可消耗
資源。當系統中供多個程序共享的資源如印表機,公用佇列等,其數目不足以滿足諸程序的需要時,會引起諸程序對資源的競爭而產生死鎖。
(3)程序推進順序不當。
程序在執行過程中,請求和釋放資源的順序不當,也同樣會導致產生程序死鎖。
如果系統資源充足,程序的資源請求都能夠得到滿足,死鎖出現的可能性就很低,否則就會因爭奪有限的資源而陷入死鎖。其次,程序執行推進順序與速度不同,也可能產生死鎖。
乙個執行緒也可引起死鎖。
產生死鎖的
四個必要條件
:(1)
互斥條件
:乙個資源每次只能被乙個程序使用。
(2)
請求和保持條件
:乙個程序因請求資源而阻塞時,對已獲得的資源保持不放。
(3)
不可搶占條件
:程序已獲得的資源,在末使用完之前,不能被強行剝奪
,只能在程序使用完時由自己釋放。
(4)
迴圈等待條件
:系統中若干程序組成環路,該環路中每個程序都在等待下乙個程序所占有的資源。
這四個條件是死鎖的必要條件,只要系統發生死鎖,這些條件必然成立,而只要上述條件之一不滿足,就不會發生死鎖。
處理死鎖的策略:
(1)忽略該問題。
(2)檢測死鎖並恢復。
(3)仔細對資源進行分配,動態地避免死鎖。
(4)防止死鎖:通過破壞引起死鎖的四個必要條件。
1、死鎖檢測和死鎖恢復
1.1 死鎖檢測
首先針對每種資源型別只有乙個例項的情況。
構建資源分配圖,採用深度優先遍歷演算法確定是否存在環路:依次將每乙個節點作為一棵樹的根節點,並進行深度優先搜尋,如果再次碰到已經遇到過的節點,那麼就算找到了乙個環。如果從任何給定的節點出發的弧都被窮舉了,那麼就回溯到前面的節點。如果回溯到根並且不能再深入下去,那麼從當前節點出發的子圖中就不包含任何環。如果所有的節點都是如此,那麼整個圖就不存在環也就是說系統不存在死鎖。
第二種情況是每種資源型別還有多個例項的情況
。構建向量矩陣,利用向量矩陣演算法模擬資源分配。這種演算法的第一步是尋找可以執行完畢的程序pi,該程序的特點是它有資源請求並且該請求可被當前的可用資源滿足(r矩陣第i行向量小於a)。這一選中的程序隨後就被執行完畢,在這段時間內它釋放自己持有的所有資源並將它們返回到可用資源庫中(將c矩陣的第i行向量加到a)。然後這一程序被標記為完成。如果所有的程序最終都能執行完畢的話,就不存在死鎖的情況。
假設n個程序,m種資源:
e=(e1,e2,...,em)現有資源向量,
a=(a1,a2,...,am)可用資源向量,
cn*m
當前分配矩陣,rn*m請求矩陣,c(ij)表示程序i所持有的資源j的數量,r(ij)表示程序i所需要的資源j的數量。
ej=aj+c11+c21+......+cn1
1.2 死鎖恢復
(1)搶占:不通知原程序的情況下,將某一資源從乙個程序強行取走給另乙個程序使用,接著送回。
(2)回滾:週期性對程序進行檢查點檢查,即將程序的狀態寫入乙個檔案以備以後重啟,包括儲存映象、資源狀態,即哪些資源分配給了哪些程序。新的檢查點不覆蓋原有的檔案,而是寫到新檔案中。檢測到死鎖時,從乙個較早的檢查點開始,將該程序復位到更早的狀態。
(3)殺死程序:殺死環中的乙個或多個程序;殺死乙個環外的程序以釋放該程序的資源。(最好殺死可以從頭開始重新執行且不會帶來***的程序)
2、避免死鎖
安全狀態:沒有死鎖,並且即使所有程序突然請求對資源的最大需求,頁仍存在某種排程次序能使每乙個程序執行完畢。
不安全狀態並不是死鎖。從安全狀態出發,系統能保證所有程序都完成,從不安全狀態出發沒有這樣的保證。
2.1 單個資源的銀行家演算法(能夠避免死鎖的排程演算法)
判斷對請求的滿足是否會導致進入不安全狀態,若是,就拒絕請求,否則,就予以分配。
2.2 多個資源的銀行家演算法
死鎖避免本質上來說是不可能的,因為它需要獲知未來的請求,而這些請求是不可知的。
3、死鎖預防
3.1破壞互斥條件
就是在系統裡取消互斥。若資源不被乙個程序獨佔使用,那麼死鎖是肯定不會發生的。但一般「互斥」條件是無法破壞的。因此,在死鎖預防裡主要是破壞其他
三個必要條件,而不去涉及破壞「互斥」條件。
3.2 破壞請求並保持條件
在系統中不允許程序在已獲得某種資源的情況下,申請其他資源。即要想出乙個辦法,阻止程序在持有資源的同時申請其他資源。有兩種方法:
方法一:
所有程序在執行之前,必須一次性地申請在整個執行過程中所需的全部資源。這樣,該程序在整個執行期間,便不會再提出資源請求,從而破壞了「請求」條件。系統在分配資源時,只要有一種資源不能滿足程序的要求,即使其它所需的各資源都空閒也不分配給該程序,而讓該程序等待。由於該程序在等待期間未占有任何資源,於是破壞了「保持」條件。
該方法優點:簡單、易行且安全。
缺點:a.資源被嚴重浪費,嚴重惡化了資源的利用率。
b.使程序經常會發生飢餓現象。
方法二:要求每個程序提出新的資源申請前,釋放它所占有的資源,然後再嘗試一次獲得所需的全部資源。
3.3 破環不可搶占條件
允許對資源實行搶占。
方法一:如果占有某些資源的乙個程序進行進一步資源請求被拒絕,則該程序必須釋放它最初占有的資源,如果有必要,可再次請求這些資源和另外的資源。
方法二:如果乙個程序請求當前被另乙個程序占有的乙個資源,則作業系統可以搶占另乙個程序,要求它釋放資源。只有在任意兩個程序的優先順序都不相同的條件下,
該方法才能預防死鎖。
3.4 破壞環路等待條件
(1)保證每乙個程序在任何時刻只能占用乙個資源,若要請求另外乙個資源,它必須先釋放第乙個資源。
(2)將系統中的所有資源統一編號,程序可在任何時刻提出資源申請,但所有申請必須按照資源的編號順序(公升序)提出。這樣做就能保證系統不出現死鎖。
死鎖的預防 避免 檢測 恢復
一組程序中每個程序都等待此組程序中其他程序所占有的,因而永遠無法得到的資源,這種現象稱為程序死鎖。產生的條件 上述條件同時滿足時,死鎖才會發生。根本原因是系統提供的資源個數小於併發程序所需的該類資源。可分為競爭資源產生的死鎖 程序通訊產生的死鎖 其他原因等。死鎖預防 靜態策略 死鎖避免 動態策略,不...
死鎖 死鎖的預防和避免
死鎖是指兩個或兩個以上的程序在執行過程中,由於競爭資源或者由於彼此通訊而造成的一種阻塞的現象,若無外力作用,它們都將無法推進下去。此時稱系統處於死鎖狀態或系統產生了死鎖,這些永遠在互相等待的程序稱為死鎖程序。由死鎖的定義可知,死鎖主要是由於競爭資源引起的,那麼這裡的資源指的是哪些資源呢?系統中的資源...
死鎖及其解決方案(避免 預防 檢測)
所謂死鎖 是指兩個或兩個以上的程序在執行過程中,因爭奪資源而造成的一種互相等待的現象,若無外力作用,它們都將無法推進下去。此時稱系統處於死鎖 死鎖產生的原因?1.因競爭資源發生死鎖 現象 系統中供多個程序共享的資源的數目不足以滿足全部程序的需要時,就會引起對諸資源的競爭而發生死鎖現象 2.程序推進順...