死鎖與活鎖的區別,死鎖與飢餓的區別

2021-08-13 00:47:18 字數 1444 閱讀 3165

死鎖:是指兩個或兩個以上的程序(或執行緒)在執行過程中,因爭奪資源而造成的一種互相等待的現象,若無外力作用,它們都將無法推進下去。此時稱系統處於死鎖狀態或系統產生了死鎖,這些永遠在互相等待的程序稱為死鎖程序。

死鎖發生的四個條件

1、互斥條件:執行緒對資源的訪問是排他性的,如果乙個執行緒對占用了某資源,那麼其他執行緒必須處於等待狀態,直到資源被釋放。

2、請求和保持條件:執行緒t1至少已經保持了乙個資源r1占用,但又提出對另乙個資源r2請求,而此時,資源r2被其他執行緒t2占用,於是該執行緒t1也必須等待,但又對自己保持的資源r1不釋放。

3、不剝奪條件:執行緒已獲得的資源,在未使用完之前,不能被其他執行緒剝奪,只能在使用完以後由自己釋放。

4、環路等待條件:在死鎖發生時,必然存在乙個「程序-資源環形鏈」,即:,程序p0(或執行緒)等待p1占用的資源,p1等待p2占用的資源,pn等待p0占用的資源。(最直觀的理解是,p0等待p1占用的資源,而p1而在等待p0占用的資源,於是兩個程序就相互等待)

活鎖:是指執行緒1可以使用資源,但它很禮貌,讓其他執行緒先使用資源,執行緒2也可以使用資源,但它很紳士,也讓其他執行緒先使用資源。這樣你讓我,我讓你,最後兩個執行緒都無法使用資源。

關於「死鎖與活鎖」的比喻:

死鎖:迎面開來的汽車a和汽車b過馬路,汽車a得到了半條路的資源(滿足死鎖發生條件1:資源訪問是排他性的,我佔了路你就不能上來,除非你爬我頭上去),汽車b佔了汽車a的另外半條路的資源,a想過去必須請求另一半被b占用的道路(死鎖發生條件2:必須整條車身的空間才能開過去,我已經佔了一半,尼瑪另一半的路被b占用了),b若想過去也必須等待a讓路,a是輛蘭博基尼,b是開奇瑞qq的屌絲,a素質比較低開窗對b狂罵:快給老子讓開,b很生氣,***的,老子就不讓(死鎖發生條件3:在未使用完資源前,不能被其他執行緒剝奪),於是兩者相互僵持乙個都走不了(死鎖發生條件4:環路等待條件),而且導致整條道上的後續車輛也走不了。

例如:馬路中間有條小橋,只能容納一輛車經過,橋兩頭開來兩輛車a和b,a比較禮貌,示意b先過,b也比較禮貌,示意a先過,結果兩人一直謙讓誰也過不去。

飢餓:是指如果執行緒t1占用了資源r,執行緒t2又請求封鎖r,於是t2等待。t3也請求資源r,當t1釋放了r上的封鎖後,系統首先批准了t3的請求,t2仍然等待。然後t4又請求封鎖r,當t3釋放了r上的封鎖之後,系統又批准了t4的請求......,t2可能永遠等待。

關於」飢餓「的比喻:

在「首堵」北京的某一天,天氣陰沉,空氣中充斥著霧霾和地溝油的味道,某個苦逼的臨時工交警正在處理塞車,有兩條道a和b上都堵滿了車輛,其中a道堵的時間最長,b相對相對堵的時間較短,這時,前面道路已疏通,交警按照最佳分配原則,示意b道上車輛先過,b道路上過了一輛又一輛,a道上排隊時間最長的確沒法通過,只能等b道上沒有車輛通過的時候再等交警發指令讓a道依次通過,這也就是reentrantlock顯示鎖裡提供的不公平鎖機制(當然了,reentrantlock也提供了公平鎖的機制,由使用者根據具體的使用場景而決定到底使用哪種鎖策略),不公平鎖能夠提高吞吐量但不可避免的會造成某些執行緒的飢餓。

死鎖與活鎖的區別,死鎖與飢餓的區別

是指兩個或者兩個以上的程序 或執行緒 在執行過程中,因爭奪資源而造成的一種互相等待的現象,若無外力作用,他們將無法推進下去。互相爭奪共享資源 只需要破壞上面 4 個條件中的乙個就能破壞。任務或者執行者沒有被阻塞,由於某些條件沒有滿足,導致一直重複嘗試 失敗 嘗試 失敗。在這期間執行緒狀態會不停的改變...

死鎖 活鎖 飢餓

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

死鎖 活鎖 飢餓

活鎖飢餓 是指兩個或兩個以上的程序 或執行緒 在執行過程中,因爭奪資源而造成的一種互相等待的現象,若無外力作用,它們都將無法推進下去。診斷要通過迴圈圖法 耗時法來判斷。通過犧牲代價最小的事務來解除死鎖。例如撤銷或掛起一些程序,以便 一些資源,再將這些資源分配給已處於阻塞狀態的程序,使之轉為就緒狀態,...