版權(quán)歸原作者所有,如有侵權(quán),請(qǐng)聯(lián)系我們

[科普中國(guó)]-活鎖

科學(xué)百科
原創(chuàng)
科學(xué)百科為用戶提供權(quán)威科普內(nèi)容,打造知識(shí)科普陣地
收藏

概述

活鎖指的是任務(wù)或者執(zhí)行者沒(méi)有被阻塞,由于某些條件沒(méi)有滿足,導(dǎo)致一直重復(fù)嘗試,失敗,嘗試,失敗。 活鎖和死鎖的區(qū)別在于,處于活鎖的實(shí)體是在不斷的改變狀態(tài),所謂的“活”, 而處于死鎖的實(shí)體表現(xiàn)為等待;活鎖有可能自行解開(kāi),死鎖則不能。

活鎖可以認(rèn)為是一種特殊的饑餓。 下面這個(gè)例子在有的文章里面認(rèn)為是活鎖。實(shí)際上這只是一種饑餓。因?yàn)闆](méi)有體現(xiàn)出“活”的特點(diǎn)。 假設(shè)事務(wù)T2再不斷的重復(fù)嘗試獲取鎖R,那么這個(gè)就是活鎖。

如果事務(wù)T1封鎖了數(shù)據(jù)R,事務(wù)T2又請(qǐng)求封鎖R,于是T2等待。T3也請(qǐng)求封鎖R,當(dāng)T1釋放了R上的封鎖后,系統(tǒng)首先批準(zhǔn)了T3的請(qǐng)求,T2仍然等待。然后T4又請(qǐng)求封鎖R,當(dāng)T3釋放了R上的封鎖之后,系統(tǒng)又批準(zhǔn)了T4的請(qǐng)求......T2可能永遠(yuǎn)等待。

活鎖應(yīng)該是一系列進(jìn)程在輪詢地等待某個(gè)不可能為真的條件為真?;铈i的時(shí)候進(jìn)程是不會(huì)blocked,這會(huì)導(dǎo)致耗盡CPU資源1。

事例單一實(shí)體的活鎖

例如線程從隊(duì)列中拿出一個(gè)任務(wù)來(lái)執(zhí)行,如果任務(wù)執(zhí)行失敗,那么將任務(wù)重新加入隊(duì)列,繼續(xù)執(zhí)行。假設(shè)任務(wù)總是執(zhí)行失敗,或者某種依賴的條件總是不滿足,那么線程一直在繁忙卻沒(méi)有任何結(jié)果。

協(xié)同導(dǎo)致的活鎖

生活中的典型例子: 兩個(gè)人在窄路相遇,同時(shí)向一個(gè)方向避讓,然后又向另一個(gè)方向避讓,如此反復(fù)。

通信中也有類似的例子,多個(gè)用戶共享信道(最簡(jiǎn)單的例子是大家都用對(duì)講機(jī)),同一時(shí)刻只能有一方發(fā)送信息。發(fā)送信號(hào)的用戶會(huì)進(jìn)行沖突檢測(cè), 如果發(fā)生沖突,就選擇避讓,然后再發(fā)送。 假設(shè)避讓算法不合理,就導(dǎo)致每次發(fā)送,都沖突,避讓后再發(fā)送,還是沖突。

計(jì)算機(jī)中的例子:兩個(gè)線程發(fā)生了某些條件的碰撞后重新執(zhí)行,那么如果再次嘗試后依然發(fā)生了碰撞,長(zhǎng)此下去就有可能發(fā)生活鎖。

解決方法解決協(xié)同活鎖的一種方案是調(diào)整重試機(jī)制。

**比如引入一些隨機(jī)性。**例如如果檢測(cè)到?jīng)_突,那么就暫停隨機(jī)的一定時(shí)間進(jìn)行重試。這回大大減少碰撞的可能性。 典型的例子是以太網(wǎng)的CSMA/CD檢測(cè)機(jī)制。

另外為了避免可能的死鎖,適當(dāng)加入一定的重試次數(shù)也是有效的解決辦法。盡管這在業(yè)務(wù)上會(huì)引起一些復(fù)雜的邏輯處理。

比如約定重試機(jī)制避免再次沖突。 例如自動(dòng)駕駛的防碰撞系統(tǒng)(假想的例子),可以根據(jù)序列號(hào)約定檢測(cè)到相撞風(fēng)險(xiǎn)時(shí),序列號(hào)小的飛機(jī)朝上飛, 序列號(hào)大的飛機(jī)朝下飛。

死鎖與活鎖死鎖:迎面開(kāi)來(lái)的汽車A和汽車B過(guò)馬路,汽車A得到了半條路的資源(滿足死鎖發(fā)生條件1:資源訪問(wèn)是排他性的,我占了路你就不能上來(lái),除非你爬我頭上去),汽車B占了汽車A的另外半條路的資源,A想過(guò)去必須請(qǐng)求另一半被B占用的道路(死鎖發(fā)生條件2:必須整條車身的空間才能開(kāi)過(guò)去,我已經(jīng)占了一半,尼瑪另一半的路被B占用了),B若想過(guò)去也必須等待A讓路,A是輛蘭博基尼,B是開(kāi)奇瑞QQ的屌絲,A素質(zhì)比較低開(kāi)窗對(duì)B狂罵:快給老子讓開(kāi),B很生氣,你媽逼的,老子就不讓(死鎖發(fā)生條件3:在未使用完資源前,不能被其他線程剝奪),于是兩者相互僵持一個(gè)都走不了(死鎖發(fā)生條件4:環(huán)路等待條件),而且導(dǎo)致整條道上的后續(xù)車輛也走不了。

活鎖:馬路中間有條小橋,只能容納一輛車經(jīng)過(guò),橋兩頭開(kāi)來(lái)兩輛車A和B,A比較禮貌,示意B先過(guò),B也比較禮貌,示意A先過(guò),結(jié)果兩人一直謙讓誰(shuí)也過(guò)不去2。

評(píng)論
科普cuili007
學(xué)士級(jí)
明白了
2023-01-02