A. 活鎖和死鎖是什麼意思啊
1、活鎖指的是任務或者執行者沒有被阻塞,由於某些條件沒有滿足,導致一直重復嘗試—失敗—嘗試—失敗的過程。處於活鎖的實體是在不斷的改變狀態,活鎖有可能自行解開。
2、死鎖是指兩個或兩個以上的線程在執行過程中,由於競爭資源或者由於彼此通信而造成的一種阻塞的現象,若無外力作用,它們都將無法推進下去。此時稱系統處於死鎖狀態或系統產生了死鎖,這些永遠在互相等待的進程稱為死鎖進程。
(1)死鎖的定義演算法解釋擴展閱讀:
死鎖經常與正常阻塞混淆。事務請求被其他事務鎖定的資源的鎖時,發出請求的事務一直等到該鎖被釋放。默認情況下,除非設置了 LOCK_TIMEOUT,否則 SQL Server 事務不會超時。因為發出請求的事務未執行任何操作來阻塞擁有鎖的事務,所以該事務是被阻塞,而不是陷入了死鎖。最後,擁有鎖的事務將完成並釋放鎖,然後發出請求底事務將獲取鎖並繼續執行。
B. 什麼是死鎖,死鎖的原因是什麼
自鎖,不是死鎖。自鎖是由於摩擦力的存在讓本來可以實現轉動的機械出現無論加再大力也無法轉動的現象。它的原因是由於角度的原因,摩擦分力始終大於動力分力。
C. 什麼是死鎖如何解決死鎖問題
死鎖的條件 互斥條件(Mutual exclusion):資源不能被共享,只能由一個進程使用。 請求與保持條件(Hold and wait):已經得到資源的進程可以再次申請新的資源。 非剝奪條件(No pre-emption):已經分配的資源不能從相應的進程中被強制地剝奪。 循環等待條件(Circular wait):系統中若干進程組成環路,改環路中每個進程都在等待相鄰進程正佔用的資源。 處理死鎖的策略 1.忽略該問題。例如鴕鳥演算法,該演算法可以應用在極少發生死鎖的的情況下。為什麼叫鴕鳥演算法呢,因為傳說中鴕鳥看到危險就把頭埋在地底下,可能鴕鳥覺得看不到危險也就沒危險了吧。跟掩耳盜鈴有點像。 2.檢測死鎖並且恢復。 3.仔細地對資源進行動態分配,以避免死鎖。 4.通過破除死鎖四個必要條件之一,來防止死鎖產生。
D. 名詞解釋 死鎖
所謂死鎖,是指在一個進程集合中的每個進程都在等待僅由該集合中的另一個進程才能引發的事件而無限期地僵持下去的局面。
E. 什麼是死鎖及死鎖的必要條件和解決方法
(1)
互斥條件:一個資源每次只能被一個進程使用。
(2)
請求與保持條件:一個進程因請求資源而阻塞時,對已獲得的資源保持不放。
(3)
不剝奪條件:進程已獲得的資源,在末使用完之前,不能強行剝奪。
(4)
循環等待條件:若干進程之間形成一種頭尾相接的循環等待資源關系。
這四個條件是死鎖的必要條件,只要系統發生死鎖,這些條件必然成立,而只要上述條件之一不滿足,就不會發生死鎖。
F. 死鎖的概念
謂死鎖: 是指兩個或兩個以上的進程在執行過程中,因爭奪資源而造成的一種互相等待的現象,若無外力作用,它們都將無法推進下去。此時稱系統處於死鎖狀態或系統產生了死鎖,這些永遠在互相等待的進程稱為死鎖進程。 由於資源佔用是互斥的,當某個進程提出申請資源後,使得有關進程在無外力協助下,永遠分配不到必需的資源而無法繼續運行,這就產生了一種特殊現象:死鎖。」
望樓主採納!!!
G. 什麼是死鎖產生死鎖的原因是什麼
如果一個進程集合裡面的每個進程都在等待這個集合中的其他一個進程(包括自身)才能繼續往下執行,若無外力他們將無法推進,這種情況就是死鎖,處於死鎖狀態的進程稱為死鎖進程。
死鎖產生的原因如下:
1.因競爭資源發生死鎖 現象:系統中供多個進程共享的資源的數目不足以滿足全部進程的需要時,就會引起對諸資源的競爭而發生死鎖現象
(1)可剝奪資源和不可剝奪資源:可剝奪資源是指某進程在獲得該類資源時,該資源同樣可以被其他進程或系統剝奪,不可剝奪資源是指當系統把該類資源分配給某個進程時,不能強制收回,只能在該進程使用完成後自動釋放
(2)競爭不可剝奪資源:系統中不可剝奪資源的數目不足以滿足諸進程運行的要求,則發生在運行進程中,不同的進程因爭奪這些資源陷入僵局。
舉例說明: 資源A,B; 進程C,D
資源A,B都是不可剝奪資源:一個進程申請了之後,不能強制收回,只能進程結束之後自動釋放。內存就是可剝奪資源
進程C申請了資源A,進程D申請了資源B。
接下來C的操作用到資源B,D的資源用到資源A。但是C,D都得不到接下來的資源,那麼就引發了死鎖。
(3)競爭臨時資源
2.進程推進順序不當發生死鎖。
H. 死鎖的概述
死鎖的規范定義:集合中的每一個進程都在等待只能由本集合中的其他進程才能引發的事件,那麼該組進程是死鎖的。
一種情形,此時執行程序中兩個或多個線程發生永久堵塞(等待),每個線程都在等待被其他線程佔用並堵塞了的資源。例如,如果線程A鎖住了記錄1並等待記錄2,而線程B鎖住了記錄2並等待記錄1,這樣兩個線程就發生了死鎖現象。
計算機系統中,如果系統的資源分配策略不當,更常見的可能是程序員寫的程序有錯誤等,則會導致進程因競爭資源不當而產生死鎖的現象。
在兩個或多個任務中,如果每個任務鎖定了其他任務試圖鎖定的資源,此時會造成這些任務永久阻塞,從而出現死鎖。例如:事務A 獲取了行 1 的共享鎖。事務 B 獲取了行 2 的共享鎖。
排他鎖,等待事務 B 完成並釋放其對行 2 持有的共享鎖之前被阻塞。
排他鎖,等待事務 A 完成並釋放其對行 1 持有的共享鎖之前被阻塞。
事務 B 完成之後事務 A 才能完成,但是事務 B 由事務 A 阻塞。該條件也稱為循環依賴關系:事務 A 依賴於事務 B,事務 B 通過對事務 A 的依賴關系關閉循環。
除非某個外部進程斷開死鎖,否則死鎖中的兩個事務都將無限期等待下去。Microsoft SQL Server 資料庫引擎死鎖監視器定期檢查陷入死鎖的任務。如果監視器檢測到循環依賴關系,將選擇其中一個任務作為犧牲品,然後終止其事務並提示錯誤。這樣,其他任務就可以完成其事務。對於事務以錯誤終止的應用程序,它還可以重試該事務,但通常要等到與它一起陷入死鎖的其他事務完成後執行。
在應用程序中使用特定編碼約定可以減少應用程序導致死鎖的機會。有關詳細信息,請參閱將死鎖減至最少。
死鎖經常與正常阻塞混淆。事務請求被其他事務鎖定的資源的鎖時,發出請求的事務一直等到該鎖被釋放。默認情況下,除非設置了 LOCK_TIMEOUT,否則 SQL Server 事務不會超時。因為發出請求的事務未執行任何操作來阻塞擁有鎖的事務,所以該事務是被阻塞,而不是陷入了死鎖。最後,擁有鎖的事務將完成並釋放鎖,然後發出請求底事務將獲取鎖並繼續執行。
死鎖有時稱為抱死。
不只是關系資料庫管理系統,任何多線程系統上都會發生死鎖,並且對於資料庫對象的鎖之外的資源也會發生死鎖。例如,多線程操作系統中的一個線程要獲取一個或多個資源(例如,內存塊)。如果要獲取的資源當前為另一線程所擁有,則第一個線程可能必須等待擁有線程釋放目標資源。這就是說,對於該特定資源,等待線程依賴於擁有線程。在資料庫引擎實例中,當獲取非資料庫資源(例如,內存或線程)時,會話會死鎖。
在示例中,對於 Part表鎖資源,事務 T1 依賴於事務 T2。同樣,對於 Supplier表鎖資源,事務 T2 依賴於事務 T1。因為這些依賴關系形成了一個循環,所以在事務 T1 和事務 T2 之間存在死鎖。
當表進行了分區並且 ALTER TABLE 的 LOCK_ESCALATION 設置設為 AUTO 時也會發生死鎖。當 LOCK_ESCALATION 設為 AUTO 時,通過允許資料庫引擎在 HoBT 級別而不是 TABLE 級別鎖定表分區會增加並發情況。但是,當單獨的事務在某個表中持有分區鎖並希望在其他事務分區上的某處持有鎖時,會導致發生死鎖。通過將 LOCK_ESCALATION 設為 TABLE 可以避免這種類型的死鎖,但此設置會因強制某個分區的大量更新以等待某個表鎖而減少並發情況。