活鎖(livelock) 專題

2021-09-22 20:23:13 字數 1101 閱讀 2233

活鎖(livelock)

活鎖指的是任務或者執行者沒有被阻塞,由於某些條件沒有滿足,導致一直重複嘗試,失敗,嘗試,失敗。

活鎖和死鎖的區別在於,處於活鎖的實體是在不斷的改變狀態,所謂的「活」, 而處於死鎖的實體表現為等待;

活鎖有可能自行解開,死鎖則不能。

活鎖可以認為是一種特殊的飢餓。

下面這個例子在有的文章裡面認為是活鎖。實際上這只是一種飢餓。因為沒有體現出「活」的特點。 假設事務t2再不斷的重複嘗試獲取鎖r,那麼這個就是活鎖。 如果事務t1封鎖了資料r,事務t2又請求封鎖r,於是t2等待。t3也請求封鎖r,當t1釋放了r上的封鎖後,系統首先批准了t3的請求,t2仍然等待。然後t4又請求封鎖r,當t3釋放了r上的封鎖之後,系統又批准了t4的請求......t2可能永遠等待。 活鎖應該是一系列程序在輪詢地等待某個不可能為真的條件為真。活鎖的時候程序是不會blocked,這會導致耗盡cpu資源。 活鎖的例子

單一實體的活鎖 例如執行緒從佇列中拿出乙個任務來執行,如果任務執行失敗,那麼將任務重新加入佇列,繼續執行。假設任務總是執行失敗,或者某種依賴的條件總是不滿足,那麼執行緒一直在繁忙卻沒有任何結果。 協同導致的活鎖 生活中的典型例子: 兩個人在窄路相遇,同時向乙個方向避讓,然後又向另乙個方向避讓,如此反覆。 通訊中也有類似的例子,多個使用者共享通道(最簡單的例子是大家都用對講機),同一時刻只能有一方傳送資訊。傳送訊號的使用者會進行衝突檢測, 如果發生衝突,就選擇避讓,然後再傳送。 假設避讓演算法不合理,就導致每次傳送,都衝突,避讓後再傳送,還是衝突。 計算機中的例子:兩個執行緒發生了某些條件的碰撞後重新執行,那麼如果再次嘗試後依然發生了碰撞,長此下去就有可能發生活鎖。 活鎖的解決方法

解決協同活鎖的一種方案是調整重試機制。 比如引入一些隨機性。例如如果檢測到衝突,那麼就暫停隨機的一定時間進行重試。這回大大減少碰撞的可能性。 典型的例子是乙太網的csma/cd檢測機制。 另外為了避免可能的死鎖,適當加入一定的重試次數也是有效的解決辦法。儘管這在業務上會引起一些複雜的邏輯處理。 比如約定重試機制避免再次衝突。 例如自動駕駛的防碰撞系統(假想的例子),可以根據序列號約定檢測到相撞風險時,序列號小的飛機朝上飛, 序列號大的飛機朝下飛。

死鎖與活鎖

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

死鎖和活鎖

死鎖 是指兩個或兩個以上的程序在執行過程中,因爭奪資源而造成的一種互相等待的現象。雖然程序在執行過程中,可能發生死鎖,但死鎖的發生也必須具備一定的條件,死鎖的發生必須具備以下四個必要條件。1 互斥條件 指程序對所分配到的資源進行排它性使用,即在 一段時間內某資源只由乙個程序占用。如果此時還有其它程序...

死鎖 活鎖 飢餓

1.活鎖指的是任務或者執行者沒有被阻塞,由於某些條件沒有滿足,導致一直重複嘗試,失敗,嘗試,失敗。2.活鎖和死鎖的區別在於,處於活鎖的實體是在不斷的改變狀態,所謂的 活 而處於死鎖的實體表現為等待 活鎖有可能自行解開,死鎖則不能。3.活鎖可以認為是一種特殊的飢餓。下面這個例子在有的文章裡面認為是活鎖...