什么是死鎖有什么處理及排除方法
什么是死鎖有什么處理及排除方法
死鎖是指兩個或兩個以上的進(jìn)程在執(zhí)行過程中,由于競爭資源或者由于彼此通信而造成的一種阻塞的現(xiàn)象,那么你對死鎖了解多少呢?以下是由學(xué)習(xí)啦小編整理關(guān)于什么是死鎖,希望大家喜歡!
死鎖的定義
死鎖的規(guī)范定義:集合中的每一個進(jìn)程都在等待只能由本集合中的其他進(jìn)程才能引發(fā)的事件,那么該組進(jìn)程是死鎖的。
一種情形,此時執(zhí)行程序中兩個或多個線程發(fā)生永久堵塞(等待),每個線程都在等待被其他線程占用并堵塞了的資源。例如,如果線程A鎖住了記錄1并等待記錄2,而線程B鎖住了記錄2并等待記錄1,這樣兩個線程就發(fā)生了死鎖現(xiàn)象。
計(jì)算機(jī)系統(tǒng)中,如果系統(tǒng)的資源分配策略不當(dāng),更常見的可能是程序員寫的程序有錯誤等,則會導(dǎo)致進(jìn)程因競爭資源不當(dāng)而產(chǎn)生死鎖的現(xiàn)象。
在兩個或多個任務(wù)中,如果每個任務(wù)鎖定了其他任務(wù)試圖鎖定的資源,此時會造成這些任務(wù)永久阻塞,從而出現(xiàn)死鎖。例如:事務(wù)A 獲取了行 1 的共享鎖。事務(wù) B 獲取了行 2 的共享鎖。
排他鎖,等待事務(wù) B 完成并釋放其對行 2 持有的共享鎖之前被阻塞。
排他鎖,等待事務(wù) A 完成并釋放其對行 1 持有的共享鎖之前被阻塞。
事務(wù) B 完成之后事務(wù) A 才能完成,但是事務(wù) B 由事務(wù) A 阻塞。該條件也稱為循環(huán)依賴關(guān)系:事務(wù) A 依賴于事務(wù) B,事務(wù) B 通過對事務(wù) A 的依賴關(guān)系關(guān)閉循環(huán)。
除非某個外部進(jìn)程斷開死鎖,否則死鎖中的兩個事務(wù)都將無限期等待下去。Microsoft SQL Server 數(shù)據(jù)庫引擎死鎖監(jiān)視器定期檢查陷入死鎖的任務(wù)。如果監(jiān)視器檢測到循環(huán)依賴關(guān)系,將選擇其中一個任務(wù)作為犧牲品,然后終止其事務(wù)并提示錯誤。這樣,其他任務(wù)就可以完成其事務(wù)。對于事務(wù)以錯誤終止的應(yīng)用程序,它還可以重試該事務(wù),但通常要等到與它一起陷入死鎖的其他事務(wù)完成后執(zhí)行。
在應(yīng)用程序中使用特定編碼約定可以減少應(yīng)用程序?qū)е滤梨i的機(jī)會。有關(guān)詳細(xì)信息,請參閱將死鎖減至最少。
死鎖經(jīng)常與正常阻塞混淆。事務(wù)請求被其他事務(wù)鎖定的資源的鎖時,發(fā)出請求的事務(wù)一直等到該鎖被釋放。默認(rèn)情況下,除非設(shè)置了 LOCK_TIMEOUT,否則 SQL Server 事務(wù)不會超時。因?yàn)榘l(fā)出請求的事務(wù)未執(zhí)行任何操作來阻塞擁有鎖的事務(wù),所以該事務(wù)是被阻塞,而不是陷入了死鎖。最后,擁有鎖的事務(wù)將完成并釋放鎖,然后發(fā)出請求底事務(wù)將獲取鎖并繼續(xù)執(zhí)行。
死鎖有時稱為抱死。
不只是關(guān)系數(shù)據(jù)庫管理系統(tǒng),任何多線程系統(tǒng)上都會發(fā)生死鎖,并且對于數(shù)據(jù)庫對象的鎖之外的資源也會發(fā)生死鎖。例如,多線程操作系統(tǒng)中的一個線程要獲取一個或多個資源(例如,內(nèi)存塊)。如果要獲取的資源當(dāng)前為另一線程所擁有,則第一個線程可能必須等待擁有線程釋放目標(biāo)資源。這就是說,對于該特定資源,等待線程依賴于擁有線程。在數(shù)據(jù)庫引擎實(shí)例中,當(dāng)獲取非數(shù)據(jù)庫資源(例如,內(nèi)存或線程)時,會話會死鎖。
在示例中,對于 Part表鎖資源,事務(wù) T1 依賴于事務(wù) T2。同樣,對于 Supplier表鎖資源,事務(wù) T2 依賴于事務(wù) T1。因?yàn)檫@些依賴關(guān)系形成了一個循環(huán),所以在事務(wù) T1 和事務(wù) T2 之間存在死鎖。
當(dāng)表進(jìn)行了分區(qū)并且 ALTER TABLE 的 LOCK_ESCALATION 設(shè)置設(shè)為 AUTO 時也會發(fā)生死鎖。當(dāng) LOCK_ESCALATION 設(shè)為 AUTO 時,通過允許數(shù)據(jù)庫引擎在 HoBT 級別而不是 TABLE 級別鎖定表分區(qū)會增加并發(fā)情況。但是,當(dāng)單獨(dú)的事務(wù)在某個表中持有分區(qū)鎖并希望在其他事務(wù)分區(qū)上的某處持有鎖時,會導(dǎo)致發(fā)生死鎖。通過將 LOCK_ESCALATION 設(shè)為 TABLE 可以避免這種類型的死鎖,但此設(shè)置會因強(qiáng)制某個分區(qū)的大量更新以等待某個表鎖而減少并發(fā)情況。
死鎖產(chǎn)生條件
雖然進(jìn)程在運(yùn)行過程中,可能發(fā)生死鎖,但死鎖的發(fā)生也必須具備一定的條件,死鎖的發(fā)生必須具備以下四個必要條件。
1)互斥條件:指進(jìn)程對所分配到的資源進(jìn)行排它性使用,即在一段時間內(nèi)某資源只由一個進(jìn)程占用。如果此時還有其它進(jìn)程請求資源,則請求者只能等待,直至占有資源的進(jìn)程用畢釋放。
2)請求和保持條件:指進(jìn)程已經(jīng)保持至少一個資源,但又提出了新的資源請求,而該資源已被其它進(jìn)程占有,此時請求進(jìn)程阻塞,但又對自己已獲得的其它資源保持不放。
3)不剝奪條件:指進(jìn)程已獲得的資源,在未使用完之前,不能被剝奪,只能在使用完時由自己釋放。
4)環(huán)路等待條件:指在發(fā)生死鎖時,必然存在一個進(jìn)程——資源的環(huán)形鏈,即進(jìn)程集合{P0,P1,P2,···,Pn}中的P0正在等待一個P1占用的資源;P1正在等待P2占用的資源,……,Pn正在等待已被P0占用的資源。
死鎖產(chǎn)生原因
1)競爭資源引起進(jìn)程死鎖
當(dāng)系統(tǒng)中供多個進(jìn)程共享的資源如打印機(jī)、公用隊(duì)列的等,其數(shù)目不足以滿足諸進(jìn)程的需要時,會引起諸進(jìn)程對資源的競爭而產(chǎn)生死鎖。
2)可剝奪資源和不可剝奪資源
系統(tǒng)中的資源可以分為兩類,一類是可剝奪資源,是指某進(jìn)程在獲得這類資源后,該資源可以再被其他進(jìn)程或系統(tǒng)剝奪。例如,優(yōu)先權(quán)高的進(jìn)程可以剝奪優(yōu)先權(quán)低的進(jìn)程的處理機(jī)。又如,內(nèi)存區(qū)可由存儲器管理程序,把一個進(jìn)程從一個存儲區(qū)移到另一個存儲區(qū),此即剝奪了該進(jìn)程原來占有的存儲區(qū),甚至可將一進(jìn)程從內(nèi)存調(diào)到外存上,可見,CPU和主存均屬于可剝奪性資源。另一類資源是不可剝奪資源,當(dāng)系統(tǒng)把這類資源分配給某進(jìn)程后,再不能強(qiáng)行收回,只能在進(jìn)程用完后自行釋放,如磁帶機(jī)、打印機(jī)等。
3)競爭不可剝奪資源
在系統(tǒng)中所配置的不可剝奪資源,由于它們的數(shù)量不能滿足諸進(jìn)程運(yùn)行的需要,會使進(jìn)程在運(yùn)行過程中,因爭奪這些資源而陷于僵局。例如,系統(tǒng)中只有一臺打印機(jī)R1和一臺磁帶機(jī)R2,可供進(jìn)程P1和P2共享。假定PI已占用了打印機(jī)R1,P2已占用了磁帶機(jī)R2,若P2繼續(xù)要求打印機(jī)R1,P2將阻塞;P1若又要求磁帶機(jī),P1也將阻塞。于是,在P1和P2之間就形成了僵局,兩個進(jìn)程都在等待對方釋放自己所需要的資源,但是它們又都因不能繼續(xù)獲得自己所需要的資源而不能繼續(xù)推進(jìn),從而也不能釋放自己所占有的資源,以致進(jìn)入死鎖狀態(tài)。
>>>下一頁更多有關(guān)“死鎖產(chǎn)生原因”內(nèi)容