看到一組漫畫,很形象的說明了死鎖、活鎖和餓死的區別,原文鏈接:http://f.dataguru.cn/thread-541686-1-1.html ,這篇文章的死鎖有點問題,死鎖參考的:https://www.cnblogs.com/lance43990740/p/6853631.html (話糙理不糙)
1.死鎖:是指兩個或兩個以上的進程(或線程)在執行過程中,因爭奪資源而造成的一種互相等待的現象,若無外力作用,它們都將無法推進下去。此時稱系統處於死鎖狀態或系統產生了死鎖,這些永遠在互相等待的進程稱為死鎖進程。
比如:迎面開來的汽車A和汽車B過馬路,汽車A得到了半條路的資源(滿足死鎖發生條件1:資源訪問是排他性的,我占了路你就不能上來,除非你爬我頭上去),汽車B占了汽車A的另外半條路的資源,A想過去必須請求另一半被B占用的道路(死鎖發生條件2:必須整條車身的空間才能開過去,我已經占了一半,尼瑪另一半的路被B占用了),B若想過去也必須等待A讓路,A是輛蘭博基尼,B是開奇瑞QQ的屌絲,A素質比較低開窗對B狂罵:快給老子讓開,B很生氣,你媽逼的,老子就不讓(死鎖發生條件3:在未使用完資源前,不能被其他線程剝奪),於是兩者相互僵持一個都走不了(死鎖發生條件4:環路等待條件),而且導致整條道上的后續車輛也走不了。(很粗魯的相互競爭)
2.活鎖:線程A和B都需要過橋(都需要使用進程),而都禮讓不走(那到的系統優先級相同,都認為不是自己優先級高),就這么僵持下去.(很紳士,互相謙讓)
3.飢餓::這是個獨木橋(單進程),橋上只能走一個人,B來到時A在橋上,B等待;
而此時比B年齡小的C來了,B讓C現行(A走完后系統把進程分給了C),
C上橋后,D又來了,B又讓D現行(C走完后系統把進程分個了D)
以此類推B一直是等待狀態.
4.產生死鎖的必要條件
(1)互斥使用(資源獨占)
一個資源每次只能給一個進程使用(比如寫操作)
(2)占有且等待
進程在申請新的資源的同時,保持對原有資源的占有
(3)不可搶占
資源申請者不能強行從資源占有者手中奪取資源,資源只能由占有者自願釋放
(4)循環等待
P1等待P2占有的資源,P2等待P3的資源,...Pn等待P1的資源,形成一個進程等待回路
5.活鎖指的是任務或者執行者沒有被阻塞,由於某些條件沒有滿足,導致一直重復嘗試,失敗,嘗試,失敗。
活鎖和死鎖的區別在於,處於活鎖的實體是在不斷的改變狀態,所謂的“活”, 而處於死鎖的實體表現為等待;活鎖有可能自行解開,死鎖則不能。
6.飢餓,是指一個可運行的進程盡管能繼續執行,但被調度器無限期地忽視,而不能被調度執行的情況。
飢餓是由資源分配策略決定的, 飢餓可以通過先來先服務等資源分配策略來避免。