多執行緒飢餓現象,飢餓與死鎖區別

2021-10-07 17:58:14 字數 2103 閱讀 8072

飢餓是指系統不能保證某個程序的等待時間上界,從而使該程序長時間等待,當等待時間給程序推進和響應帶來明顯影響時,稱發生了程序飢餓。當飢餓到一定程度的程序所賦予的任務即使完成也不再具有實際意義時稱該程序被餓死。

死鎖是指在多道程式系統中,一組程序中的每乙個程序都無限期等待被該組程序中的另乙個程序所占有且永遠不會釋放的資源。關於死鎖具體介紹大家可以看我另外一篇的總結死鎖

從程序狀態考慮,死鎖程序都處於等待狀態,忙等待(處於執行或就緒狀態)的程序並非處於等待狀態,但卻可能被餓死;

死鎖程序等待永遠不會被釋放的資源,餓死程序等待會被釋放但卻不會分配給自己的資源,表現為等待時限沒有上界(排隊等待或忙式等待);

死鎖一定發生了迴圈等待,而餓死則不然。這也表明通過資源分配圖可以檢測死鎖存在與否,但卻不能檢測是否有程序餓死;

死鎖一定涉及多個程序,而飢餓或被餓死的程序可能只有乙個。

在飢餓的情形下,系統中有至少乙個程序能正常執行,只是飢餓程序得不到執行機會。而死鎖則可能會最終使整個系統陷入死鎖並崩潰

介紹「死鎖」的例子1:如果執行緒a鎖住了記錄r1並等待記錄r2,而執行緒b鎖住了記錄r2並等待記錄r1,這樣兩個執行緒a和b就發生了死鎖現象。

介紹「死鎖」的例子2:兩個山羊過乙個獨木橋,兩隻羊同時走到橋中間,乙個山羊等另乙個山羊過去了然後再過橋,另乙個山羊等這乙個山羊過去,結果兩隻山羊都堵在中間動彈不得。

介紹飢餓的例子:資源在其中兩個或以上執行緒或程序相互使用,第三方執行緒或程序始終得不到。想像一下三個人傳球,其中兩個人傳來傳去,第三個人始終得不到。

讓有限多的工作執行緒來輪流非同步處理無限多的工作任務,也可以將其歸類為分工模式,典型實現就是執行緒池,也體現經典設計模式中的享元模式。

例如:飯店給每個客人來了,都配備乙個新的服務員那麼開銷資源消耗太大。

注意:不同的型別應該使用不同的執行緒池,這樣能避免飢餓,提公升效率。

例如:飯店切菜就是切菜的員工,服務員就是服務員。

這裡我們來說飢餓問題,大家要把飢餓和死鎖問題區分開

這裡我們能夠看到,飢餓它是兩個或者幾個執行緒需要繼續向下執行但是需要別的資源來保證自己向下執行,死鎖需要最少兩個執行緒他們之間的執行需要對方的資料資源,來幫助自己向下執行,飢餓時不能通過jconcle檢測出來的因為他們之間不競爭資源,但是死鎖可以通過工具檢測出來,因為執行緒間存在資源的競爭。

多建立乙個執行緒池解決問題,做菜執行緒池就是做菜執行緒池,服務員執行緒池就是服務員執行緒池。各個執行緒池各司其職。

多執行緒死鎖 活鎖 飢餓

1 死鎖 所謂死鎖是指多個執行緒因競爭資源而造成的一種僵局 互相等待 若無外力作用,這些程序都將無法向前推進。理解的例子 生活中的乙個例項,2個人一起吃飯但是只有一雙筷子,2人輪流吃 同時擁有2只筷子才能吃 某乙個時候,乙個拿了左筷子,一人拿了右筷子,2個人都同時占用乙個資源,等待另乙個資源,這個時...

死鎖與飢餓

首先是死鎖。產生死鎖的原因主要有兩個,一是競爭資源,系統提供的資源數量有限,不能滿足每個程序的需求 二是多道程式執行時,程序推進順序不合理。由此可見,發生死鎖時死鎖程序的個數至少是兩個。我們可以舉乙個最簡單的例子來了解一下死鎖 p1 p2 request a request b request b ...

死鎖與飢餓

首先是死鎖。產生死鎖的原因主要有兩個,一是競爭資源,系統提供的資源數量有限,不能滿足每個程序的需求 二是多道程式執行時,程序推進順序不合理。由此可見,發生死鎖時死鎖程序的個數至少是兩個。我們可以舉乙個最簡單的例子來了解一下死鎖 p1 p2 request a request b request b ...