死鎖的產生及檢測

2021-07-29 21:12:01 字數 4329 閱讀 3568

先介紹一下鎖的分類 :

鎖的類別有兩種分法:

(1)從資料庫系統的角度來看:分為獨佔鎖(即排它鎖),共享鎖和更新鎖

a. 共享 (s) :讀鎖,用於不更改或不更新資料的操作(唯讀操作),如 select 語句。

b. 更新 (u) :(介於共享和排它鎖之間),可以讓其他程式在不加鎖的條件下讀,但本程式可以隨時更改。

讀取表時使用更新鎖,而不使用共享鎖,並將鎖一直保留到語句或事務的結束。

更新鎖的優點是允許您讀取資料(不阻塞其它事務)並在以後更新資料,同時確保自從上次讀取資料後資料沒有被更改。當我們用更新鎖來讀取記錄時可以對取到的記錄加上更新鎖,從而加上鎖的記錄在其它的執行緒中是不能更改的只能等本執行緒的事務結束後才能更改,

如下示例:

begin

transaction --開始乙個事務

select qty

from mytable with (updlock)

where id in (1,2,3)

update mytable set qty = qty - a.qty

from mytable as a

inner

join @_table as b on a.id = b.id

commit

transaction --提交事務

這樣在更新時其它的執行緒或事務在這些語句執行完成前是不能更改id是1,2,3的記錄的.其它的都可以修改和讀,1,2,3的只能讀,要是修改的話只能等這些語句完成後才能操作.從而保證的資料的修改正確.

c. 排它 (x):寫鎖。 用於資料修改操作,例如 insert、update 或 delete。確保不會同時同一資源進行多重更新。

意向鎖 :用於建立鎖的層次結構。

意向鎖的型別為:意向共享 (is)、意向排它 (ix) 以及與意向排它共享 (six)。

架構鎖 :在執行依賴於表架構的操作時使用。

架構鎖的型別為:架構修改 (sch-m) 和架構穩定性 (sch-s)。

共享鎖 :共享 (s) 鎖允許併發事務讀取 (select) 乙個資源。資源上存在共享 (s) 鎖時,任何其它事務都不能修改資料。一旦已經讀取資料,便立即釋放資源上的共享 (s) 鎖,除非將事務隔離級別設定為可重複讀或更高階別,或者在事務生存週期內用鎖定提示保留共享 (s) 鎖。

更新鎖 :更新 (u) 鎖可以防止通常形式的死鎖。一般更新模式由乙個事務組成,此事務讀取記錄,獲取資源(頁或行)的共享 (s) 鎖,然後修改行,此操作要求鎖轉換為排它 (x) 鎖。如果兩個事務獲得了資源上的共享模式鎖,然後試圖同時更新資料,則乙個事務嘗試將鎖轉換為排它 (x) 鎖。共享模式到排它鎖的轉換必須等待一段時間,因為乙個事務的排它鎖與其它事務的共享模式鎖不相容;發生鎖等待。第二個事務試圖獲取排它 (x) 鎖以進行更新。由於兩個事務都要轉換為排它 (x) 鎖,並且每個事務都等待另乙個事務釋放共享模式鎖,因此發生死鎖。 若要避免這種潛在的死鎖問題,請使用更新 (u) 鎖。一次只有乙個事務可以獲得資源的更新 (u) 鎖。如果事務修改資源,則更新 (u) 鎖轉換為排它 (x) 鎖。否則,鎖轉換為共享鎖。

排它鎖 :排它 (x) 鎖可以防止併發事務對資源進行訪問。其它事務不能讀取或修改排它 (x) 鎖鎖定的資料。

意向鎖 :意向鎖表示 sql server 需要在層次結構中的某些底層資源上獲取共享 (s) 鎖或排它 (x) 鎖。例如,放置在表級的共享意向鎖表示事務打算在表中的頁或行上放置共享 (s) 鎖。在表級設定意向鎖可防止另乙個事務隨後在包含那一頁的表上獲取排它 (x) 鎖。意向鎖可以提高效能,因為 sql server 僅在表級檢查意向鎖來確定事務是否可以安全地獲取該錶上的鎖。而無須檢查表中的每行或每頁上的鎖以確定事務是否可以鎖定整個表。

死鎖的定義:

死鎖是指兩個或兩個以上的程序在執行過程中,因爭奪資源而造成的一種互相等待的現象,若無外力作用,它們都將無法推進下去。此時稱系統處於死鎖狀態或系統產生了死鎖,這些永遠在互相等待的程序稱為死鎖程序。由於資源占用是互斥的,當某個程序提出申請資源後,使得有關程序在無外力協助下,永遠分配不到必需的資源而無法繼續執行,這就產生了一種特殊現象死鎖。

產生死鎖的原因主要是:

(1) 因為系統資源不足。

(2) 程序執行推進的順序不合適。

(3) 資源分配不當等。

如果系統資源充足,程序的資源請求都能夠得到滿足,死鎖出現的可能性就很低,否則就會因爭奪有限的資源而陷入死鎖。其次,程序執行推進順序與速度不同,也可能產生死鎖。

產生死鎖的四個必要條件:

(1) 互斥條件(mutual exclusion):指程序對所分配到的資源進行排它性使用,即在一段時間內某資源只由乙個程序占用。如果此時還有其它程序請求資源,則請求者只能等待,直至占有資源的程序用畢釋放。

(2) 請求與保持條件(hold and wait):指程序已經保持至少乙個資源,但又提出了新的資源請求,而該資源已被其它程序占有,此時請求程序阻塞,但又對自己已獲得的其它資源保持不放。

(3) 不剝奪條件(no pre-emption):指程序已獲得的資源,在未使用完之前,不能被剝奪,只能在使用完時由自己釋放。

(4) 迴圈等待條件(circular wait):指在發生死鎖時,必然存在乙個程序——資源的環形鏈,即程序集合中的p0正在等待乙個p1占用的資源;p1正在等待p2占用的資源,……,pn正在等待已被p0占用的資源。

這四個條件是死鎖產生的必要條件,只要系統發生死鎖,這些條件必然成立,而只要上述條件之一不滿足,就不會發生死鎖。

避免方法:

1) 預防死鎖。

通過設定某些限制條件,去破壞產生死鎖的四個必要條件中的乙個或者幾個,來預防發生死鎖。預防死鎖是一種較易實現的方法,已被廣泛使用。但是由於所施加的限制條件往往太嚴格,可能會導致系統資源利用率和系統吞吐量降低。

2) 避免死鎖。

該方法同樣是屬於事先預防的策略,但它並不須事先採取各種限制措施去破壞產生死鎖的的四個必要條件,而是在資源的動態分配過程中,用某種方法去防止系統進入不安全狀態,從而避免發生死鎖。

3)檢測死鎖。

這種方法並不須事先採取任何限制性措施,也不必檢查系統是否已經進入不安全區,此方法允許系統在執行過程中發生死鎖。但可通過系統所設定的檢測機構,及時地檢測出死鎖的發生,並精確地確定與死鎖有關的程序和資源,然後採取適當措施,從系統中將已發生的死鎖清除掉。

4)解除死鎖。

這是與檢測死鎖相配套的一種措施。當檢測到系統中已發生死鎖時,須將程序從死鎖狀態中解脫出來。常用的實施方法是撤銷或掛起一些程序,以便**一些資源,再將這些資源分配給已處於阻塞狀態的程序,使之轉為就緒狀態,以繼續執行。死鎖的檢測和解除措施,有可能使系統獲得較好的資源利用率和吞吐量,但在實現上難度也最大。

死鎖的解除:

理解了死鎖的原因,尤其是產生死鎖的四個必要條件,就可以最大可能地避免、預防和解除死鎖。在系統設計、程序排程等方面注意如何不讓這四個必要條件成立,如何確定資源的合理分配演算法,避免程序永久佔據系統資源。

⑴有序資源分配法。

這種演算法資源按某種規則系統中的所有資源統一編號(例如印表機為1、磁帶機為2、磁碟為3、等等),申請時必須以上公升的次序。

採用有序資源分配法:r1的編號為1,r2的編號為2;pa:申請次序應是:r1,r2;pb:申請次序應是:r1,r2;這樣就破壞了環路條件,避免了死鎖的發生。

⑵銀行演算法。

避免死鎖演算法中最有代表性的演算法是dijkstrae.w於2023年提出的銀行家演算法。該演算法需要檢查申請者對資源的最大需求量,如果系統現存的各類資源可以滿足申請者的請求,就滿足申請者的請求。這樣申請者就可很快完成其計算,然後釋放它占用的資源,從而保證了系統中的所有程序都能完成,所以可避免死鎖的發生。

死鎖排除的方法

撤消陷於死鎖的全部程序;逐個撤消陷於死鎖的程序,直到死鎖不存在;從陷於死鎖的程序中逐個強迫放棄所占用的資源,直至死鎖消失;從另外一些程序那裡強行剝奪足夠數量的資源分配給死鎖程序,以解除死鎖狀態。死鎖是網路中最容易發生的故障之一,即使在網路負荷不很重時也會發生。死鎖發生時,一組節點由於沒有空閒緩衝區而元法接收和**分組,節點之間相互等待,既不能接收分組也不能**分組,並一直保持這一僵局,嚴重時甚至導致整個網路的癱瘓。 常用的實施方法是撤消或掛起一些程序,以便**一些資源,再將這些資源分配給已處於阻塞狀態的程序,使之轉為就緒狀態以繼續執行。

(1)剝奪資源。從其它程序剝壓足夠數量的資源給死鎖程序,以解除死鎖狀態;

(2)撤消程序。最簡單的撤消程序的方法是使全部死鎖程序都夭折掉;稍為溫和一點的方法是按照某種順序逐個地撤消程序,直至有足夠的資源可用,死鎖狀態消除為止。

死鎖及死鎖產生原因條件

作業系統中有若干程序併發執行,它們不斷申請 使用 釋放系統資源,雖然系統的進 程協調 通訊機構會對它們進行控制,但也可能出現若干程序都相互等待對方釋放資源才能 繼續執行,否則就阻塞的情況。此時,若不借助外界因素,誰也不能釋放資源,誰也不能解 除阻塞狀態。根據這樣的情況,作業系統中的死鎖被定義為系統中...

死鎖產生的原因及條件

一 死鎖的定義 死鎖 是指兩個或兩個以上的程序在執行過程中,因爭奪資源而造成的一種互相等待的現象,若無外力作用,它們都將無法推進下去。二 原因 1 因為系統資源不足。2 資源分配不當等。3 程序執行推進順序不合適。如果系統資源充足,程序的資源請求都能夠得到滿足,死鎖出現的可能性就很低,否則就會因爭奪...

強制程序產生coredump,檢測死鎖以及程序快照

強制程序產生coredump,檢測死鎖以及程序快照 分類 linux 2011 03 17 22 12 04 部落格 linuxfocus.blog.chinaunix.net 在軟體開發的過程中,無論如何努力,bug幾乎都是必不可少的。當某些bug發生時,該程序會產生coredump檔案。通過這個...