『壹』 什麼是死鎖,解決死鎖普遍採用的方法是什麼
砸爛它
『貳』 什麼是死鎖解決死鎖有那幾種策略這些策略分別有哪些實現方法
什麼是死鎖?如果一個進程集合裡面的每個進程都在等待只能由這個集合中的其他一個進程(包括他自身)才能引發的事件,這種情況就是死鎖。這個定義可能有點拗口,一個最簡單的例子就是有資源a和資源b,都是不可剝奪資源,現在進程c已經申請了資源a,進程d也申請了資源b,進程c接下來的操作需要用到資源b,而進程d恰好也在申請資源a,那麼就引發了死鎖。這個肯定每個人都看過了。然後套用回去定義:如果一個進程集合裡面(進程c和進程d)的每個進程(進程c和進程d)都在等待只能由這個集合中的其他一個進程(對於進程c,他在等進程d;對於進程d,他在等進程c)才能引發的事件(釋放相應資源)。這里的資源包括了軟的資源(代碼塊)和硬的資源(例如掃描儀)。資源一般可以分兩種:可剝奪資源(preemptable)和不可剝奪資源(nonpreemptable)。一般來說對於由可剝奪資源引起的死鎖可以由系統的重新分配資源來解決,所以一般來說大家說的死鎖都是由於不可剝奪資源所引起的。死鎖的四個必要條件互斥條件(mutual
exclusion):資源不能被共享,只能由一個進程使用。
請求與保持條件(hold
and
wait):已經得到資源的進程可以再次申請新的資源。
非剝奪條件(no
pre-emption):已經分配的資源不能從相應的進程中被強制地剝奪。
2.檢測死鎖並且恢復。
3.仔細地對資源進行動態分配,以避免死鎖。
4.通過破除死鎖四個必要條件之一,來防止死鎖產生。
『叄』 怎麼解決死鎖現象
死鎖排除的方法
1、撤消陷於死鎖的全部進程;
2、逐個撤消陷於死鎖的進程,直到死鎖不存在;
3、從陷於死鎖的進程中逐個強迫放棄所佔用的資源,直至死鎖消失。
4、從另外一些進程那裡強行剝奪足夠數量的資源分配給死鎖進程,以解除死鎖狀態
產生死鎖的原因主要是:
(1) 因為系統資源不足。
(2) 進程運行推進的順序不合適。
(3) 資源分配不當等。
如果系統資源充足,進程的資源請求都能夠得到滿足,死鎖出現的可能性就很低,否則
就會因爭奪有限的資源而陷入死鎖。其次,進程運行推進順序與速度不同,也可能產生死鎖
『肆』 在解決死鎖問題的幾個方法中,哪種方法最容易實現
預防死鎖最容易實現,但是由於這種方法施加的限制條件太嚴格,可能會導致系統資源利用率和系統吞吐率降低。
避免死鎖只需事先加以較弱的限制條件,便可獲得較高的資源利用率和系統吞吐率,但在實現上有一定的難度,目前較完善的系統中常用此方法來避免發生死鎖。
『伍』 資料庫中解決死鎖的常用方法有什麼
1、要求每個事務一次就將所有要使用的數據全部加鎖,否則不能執行。
2、採用按序加鎖法.預先規定一個封鎖順序,所有的事務都必須按這個順序對數據執行封鎖。
3、不採取任何措施來預防死鎖的發生,而是周期性地檢查系統中是否有死鎖.如果發現死鎖就設法解除。
『陸』 簡要介紹處理死鎖一般有哪些策略
避免死鎖的方法一般有:
有序的資源分配法,
銀行家演算法。
死鎖: 是指兩個或兩個以上的進程在執行過程中,由於競爭資源或者由於彼此通信而造成的一種阻塞的現象,若無外力作用,它們都將無法推進下去。此時稱系統處於死鎖狀態或系統產生了死鎖,這些永遠在互相等待的進程稱為死鎖進程。
產生死鎖的原因主要是:(1) 因為系統資源不足。(2) 進程運行推進的順序不合適。(3) 資源分配不當等。產生死鎖的四個必要條件:(1)互斥條件:一個資源每次只能被一個進程使用。(2)請求與保持條件:一個進程因請求資源而阻塞時,對已獲得的資源保持不放。(3)不剝奪條件:進程已獲得的資源,在末使用完之前,不能強行剝奪。(4)循環等待條件:若干進程之間形成一種頭尾相接的循環等待資源關系。
所以要根據產生死鎖的條件進行預防,並且要盡量避免死鎖。所以解決策略有:
(1)破壞互斥條件:
就是在系統里取消互斥。若資源不被一個進程獨占使用,那麼死鎖是肯定不會發生的。
但一般來說在所列的四個條件中,「互斥」條件是無法破壞的。因此,在死鎖預防里主要是破壞其他幾個必要條件,而不去涉及破壞「互斥」條件
(2)破壞「佔有並等待」條件:
破壞「佔有並等待」條件,就是在系統中不允許進程在已獲得某種資源的情況下,申請其他資源。即要想出一個辦法,阻止進程在持有資源的同時申請其他資源。
方法一:創建進程時,要求它申請所需的全部資源,系統或滿足其所有要求,或么什麼也不給它。這是所謂的 「 一次性分配」方案。
方法二:要求每個進程提出新的資源申請前,釋放它所佔有的資源。這樣,一個進程在需要資源S時,須先把它先前佔有的資源R釋放掉,然後才能提出對S的申請,即使它可能很快又要用到資源R。
(3)破壞「不可搶占」條件
破壞「不可搶占」條件就是允許對資源實行搶奪。
方法一:如果佔有某些資源的一個進程進行進一步資源請求被拒絕,則該進程必須釋放它最初佔有的資源,如果有必要,可再次請求這些資源和另外的資源。
方法二:如果一個進程請求當前被另一個進程佔有的一個資源,則操作系統可以搶占另一個進程,要求它釋放資源。只有在任意兩個進程的優先順序都不相同的條件下,方法二才能預防死鎖。
(4)破壞「循環等待」條件
破壞「循環等待」條件的一種方法,是將系統中的所有資源統一編號,進程可在任何時刻提出資源申請,但所有申請必須按照資源的編號順序(升序)提出。這樣做就能保證系統不出現死鎖。
避免死鎖: 死鎖的預防是通過破壞產生條件來阻止死鎖的產生,但這種方法破壞了系統的並行性和並發性。 死鎖產生的前三個條件是死鎖產生的必要條件,也就是說要產生死鎖必須具備的條件,而不是存在這3個條件就一定產生死鎖,那麼只要在邏輯上迴避了第四個條件就可以避免死鎖。 避免死鎖採用的是允許前三個條件存在,但通過合理的資源分配演算法來確保永遠不會形成環形等待的封閉進程鏈,從而避免死鎖。該方法支持多個進程的並行執行,為了避免死鎖,系統動態的確定是否分配一個資源給請求的進程。
總的思路來說,預防死鎖就是避免死鎖的最好方法!不過一旦預防不了而產生死鎖就應該及時中斷進程和破壞中斷。最有效的兩個做法就是一,只運行需要的進程程序而禁用其他進程程序,二,重啟機器來破壞中斷是最直接有效的。
『柒』 在解決死鎖問題的幾個方法中,哪種方法最容易實現哪種方法使資源的利用率最高
解決/處理死鎖的方法有預防死鎖、避免死鎖、檢測和解除死鎖,其中預防死鎖方法最容易實現,但由於所施加的限制條件過於嚴格,會導致系統資源利用率和系統吞吐量降低;而檢測和解除死鎖方法可是系統獲得較好的資源利用率和系統吞吐量。
『捌』 處理死鎖的方法
預防死鎖。這是一種較簡單和直觀的預先預防方法。該方法是通過設置某些限制條件,去破壞產生死鎖的四個必要條件中的一個或幾個來預防產生死鎖。預防死鎖是一種易實現的方法,已被廣泛使用。
避免死鎖。同樣是屬於事先預防策略,但它並不是事先採取各種限制措施,去破壞產生死鎖的四個必要條件,而是在資源的動態分配過程中,用某種方法防止系統進入不安全狀態,從而可以避免發生死鎖。
檢測死鎖。這種方法無須事先採取任何限性制措施,允許進程在運行過程中發生死鎖。但可通過檢測機構及時地檢測出死鎖的發生,然後採取適當的措施,把進程從死鎖中解脫出來。
解除死鎖。當檢測到系統中已發生死鎖時,就採取相應的措施,把進程從死鎖中解脫出來。常用的方法是撤消一些進程,回收它們的資源,將資源分配給已處於阻塞狀態的進程,使其能繼續運行。
『玖』 在資料庫中解決死鎖的常用方法有哪些
死鎖主要表現以下幾種情況:
表現一:
一個用戶A 訪問表A(鎖住了表A),然後又訪問表B
另一個用戶B 訪問表B(鎖住了表B),然後企圖訪問表A
這時用戶A由於用戶B已經鎖住表B,它必須等待用戶B釋放表B,才能繼續,好了他老人家就只好老老實實在這等了
同樣用戶B要等用戶A釋放表A才能繼續這就死鎖了
解決方法:
這種死鎖是由於你的程序的BUG產生的,除了調整你的程序的邏輯別無他法
仔細分析你程序的邏輯,
1:盡量避免同時鎖定兩個資源
2: 必須同時鎖定兩個資源時,要保證在任何時刻都應該按照相同的順序來鎖定資源.
表現二:
用戶A讀一條紀錄,然後修改該條紀錄
這是用戶B修改該條紀錄
這里用戶A的事務里鎖的性質由共享鎖企圖上升到獨占鎖(for update),而用戶B里的獨占鎖由於A有共享鎖存在所以必須等A釋
放掉共享鎖,而A由於B的獨占鎖而無法上升的獨占鎖也就不可能釋放共享鎖,於是出現了死鎖。
這種死鎖比較隱蔽,但其實在稍大點的項目中經常發生。
解決方法:
讓用戶A的事務(即先讀後寫類型的操作),在select 時就是用Update lock
語法如下:
select * from table1 with(updlock) where ....
如果真的table被鎖住了,可以通過下面的方法來解鎖:
Sql server企業管理器->對應的資料庫->管理->當前活動->鎖/進程ID
將對應的被鎖住的進程關閉。
還有一種方法,就是在你不知道究竟是哪張表被鎖,由何種原因被鎖,可以重新啟動資料庫來解決,但不保證下次又被鎖住,因為還沒有找到問題的根本原因。
要避免鎖表,在操作資料庫最好不要用獨占方式。
『拾』 試述死鎖產生的原因和解決辦法
產生原因
1、競爭資源引起進程死鎖
當系統中供多個進程共享的資源如列印機、公用隊列的等,其數目不足以滿足諸進程的需要時,會引起諸進程對資源的競爭而產生死鎖。
2、可剝奪資源和不可剝奪資源
系統中的資源可以分為兩類,一類是可剝奪資源,是指某進程在獲得這類資源後,該資源可以再被其他進程或系統剝奪。
3、競爭不可剝奪資源
在系統中所配置的不可剝奪資源,由於它們的數量不能滿足諸進程運行的需要,會使進程在運行過程中,因爭奪這些資源而陷於僵局。
解決方法
1、死鎖預防。
這是一種較簡單和直觀的事先預防的方法。方法是通過設置某些限制條件,去破壞產生死鎖的四個必要條件中的一個或者幾個,來預防發生死鎖。預防死鎖是一種較易實現的方法,已被廣泛使用。但是由於所施加的限制條件往往太嚴格,可能會導致系統資源利用率和系統吞吐量降低。
2、死鎖避免。
系統對進程發出的每一個系統能夠滿足的資源申請進行動態檢查,並根據檢查結果決定是否分配資源;如果分配後系統可能發生死鎖,則不予分配,否則予以分配。這是一種保證系統不進入死鎖狀態的動態策略。
3、死鎖檢測和解除。
先檢測:這種方法並不須事先採取任何限制性措施,也不必檢查系統是否已經進入不安全區,此方法允許系統在運行過程中發生死鎖。但可通過系統所設置的檢測機構,及時地檢測出死鎖的發生,並精確地確定與死鎖有關的進程和資源。
(10)解決死鎖的方法擴展閱讀:
死鎖的產生條件
1、斥條件:指進程對所分配到的資源進行排它性使用,即在一段時間內某資源只由一個進程佔用。如果此時還有其它進程請求資源,則請求者只能等待,直至佔有資源的進程用畢釋放。
2、請求和保持條件:指進程已經保持至少一個資源,但又提出了新的資源請求,而該資源已被其它進程佔有,此時請求進程阻塞,但又對自己已獲得的其它資源保持不放。
3、不剝奪條件:指進程已獲得的資源,在未使用完之前,不能被剝奪,只能在使用完時由自己釋放。
4、環路等待條件:指在發生死鎖時,必然存在一個進程——資源的環形鏈,即進程集合{P0,P1,P2,···,Pn}中的P0正在等待一個P1佔用的資源;P1正在等待P2佔用的資源,……,Pn正在等待已被P0佔用的資源。