首先是死鎖。
產生死鎖的原因主要有兩個,一是競爭資源,系統提供的資源數量有限,不能滿足每個程序的需求;二是多道程式執行時,程序推進順序不合理。由此可見,發生死鎖時死鎖程序的個數至少是兩個。我們可以舉乙個最簡單的例子來了解一下死鎖:
p1
p2
......request(a)
request(b)
request(b)
request(a)
request(b)
request(a)
request(a)
request(b)
假如雙方都擁有部分資源(p1擁有a,p2擁有b,且a,b均只有乙個),但這時p1還需要b,p2還需要a,於是p1與p2都會處在無限等待狀態,發生了死鎖。
由這個例子,我們可以歸納分析出產生死鎖的必要條件:
(1) 互斥條件
資源是獨佔的且排他使用。即任意時刻乙個資源只能給乙個程序使用,其他申請者只有等待,直到資源被佔有者釋放。如例子中的a,b資源。
(2) 不可剝奪條件
程序所獲得的資源在未使用完畢之前,不能被其他程序強行剝奪,而只能由擁有該資源的程序自願釋放。如例子中p2 不能強佔p1擁有的a資源,而p1也不能強佔p2擁有的b資源。
(3) 請求和保持條件
程序每次申請他所需要的一部分資源,在申請新的資源的同時,繼續占用已分配到的資源。如例子中p1申請b資源時繼續占有a資源,p2申請a資源時繼續占有b資源。
(4) 迴圈等待條件
(5) 在發生死鎖時,必然存在乙個程序等待環路,環路中的每乙個程序已占有的資源同時被另乙個程序所申請。如例子中的p1和p2就是乙個簡單的等待環路。
系統發生死鎖不僅浪費了大量的系統資源,甚至會導致整個系統的崩潰,因此如何解決死鎖問題是作業系統設計中的乙個重點。目前主要有兩類方法,一類是不讓死鎖發生;另一類是讓死鎖發生,再加以解決。
死鎖預防就是力圖不讓死鎖發生,它採用破壞「不可剝奪」條件,或破壞「請求保持」條件,或破壞「迴圈等待」條件來達到目的,但這種方法給系統加上了較強的限制條件,嚴重的影響了系統效能。死鎖避免則是不破壞死鎖的必要條件,而是系統對程序發出的每乙個系統能夠滿足的資源申請進行動態檢驗,並根據檢驗結果決定是否分配資源,如果分配後系統可能發生死鎖,則不分配,否則分配。
這種方法演算法複雜,會消耗很多的系統時間。
死鎖的檢測與解除則屬於讓死鎖發生,再加以解決的方法。作業系統不斷的監督程序的進展路徑,一旦檢測到死鎖的發生,則採用專門的措施解除死鎖,並以最小的代價使整個系統恢復正常。
以上大概介紹了死鎖的特點和一些關於死鎖的處理方法。下面看一下飢餓:
產生飢餓的主要原因是:在乙個動態系統中,對於每類系統資源,作業系統需要確定乙個分配策略,當多個程序同時申請某類資源時,由分配策略確定資源分配給程序的次序。有時資源分配策略可能是不公平的,即不能保證等待時間上界的存在。在這種情況下,即使系統沒有發生死鎖,某些程序也可能會長時間等待.當等待時間給程序推進和響應帶來明顯影響時,稱發生了程序飢餓,當飢餓到一定程度的程序所賦予的任務即使完成也不再具有實際意義時稱該程序被餓死。舉個例子,當有多個程序需要列印檔案時,如果系統分配印表機的策略是最短檔案優先,那麼長檔案的列印任務將由於短檔案的源源不斷到來而被無限期推遲,導致最終的飢餓甚至餓死。
飢餓沒有其產生的必要條件,隨機性很強。並且飢餓可以被消除,因此也將忙式等待時發生的飢餓稱為活鎖。
由於飢餓和餓死與資源分配策略有關,因而解決飢餓與餓死問題可從資源分配策略的公平性考慮,確保所有程序不被忽視。如時間片輪轉演算法(rr)。它將cpu的處理時間分成乙個個時間片,就緒佇列中的諸程序輪流執行乙個時間片,當時間片結束時,就強迫執行程式讓出cpu,該程序進入就緒佇列,等待下一次排程。同時,程序排程又去選擇就緒佇列中的乙個程序,分配給它乙個時間片,以投入執行。如此方式輪流排程。這樣就可以在不考慮其他系統開銷的情況下解決飢餓的問題。
最後,我們來比較的看一下死鎖與飢餓。
死鎖與餓死有一定相同點:二者都是由於競爭資源而引起的。但又有明顯差別:
(1) 從程序狀態考慮,死鎖程序都處於等待狀態,忙式等待(處於執行或就緒狀態)的程序並非處於等待狀態,但卻可能被餓死;
(2) 死鎖程序等待永遠不會被釋放的資源,餓死程序等待會被釋放但卻不會分配給自己的資源,表現為等待時限沒有上界(排隊等待或忙式等待);
(3) 死鎖一定發生了迴圈等待,而餓死則不然。這也表明通過資源分配圖可以檢測死鎖存在與否,但卻不能檢測是否有程序餓死;
(4) 死鎖一定涉及多個程序,而飢餓或被餓死的程序可能只有乙個。
(5)在飢餓的情形下,系統中有至少乙個程序能正常執行,只是飢餓程序得不到執行機會。而死鎖則可能會最終使整個系統陷入死鎖並崩潰。
總之,死鎖和飢餓是作業系統中亟待解決的重要問題,發明出乙個令人滿意的完善的解決方法是乙個誘人的且永遠不會過時的課題。
死鎖與飢餓
首先是死鎖。產生死鎖的原因主要有兩個,一是競爭資源,系統提供的資源數量有限,不能滿足每個程序的需求 二是多道程式執行時,程序推進順序不合理。由此可見,發生死鎖時死鎖程序的個數至少是兩個。我們可以舉乙個最簡單的例子來了解一下死鎖 p1 p2 request a request b request b ...
死鎖與飢餓
首先是死鎖。產生死鎖的原因主要有兩個,一是競爭資源,系統提供的資源數量有限,不能滿足每個程序的需求 二是多道程式執行時,程序推進順序不合理。由此可見,發生死鎖時死鎖程序的個數至少是兩個。我們可以舉乙個最簡單的例子來了解一下死鎖 p1 p2 request a request b request b ...
多執行緒飢餓現象,飢餓與死鎖區別
飢餓是指系統不能保證某個程序的等待時間上界,從而使該程序長時間等待,當等待時間給程序推進和響應帶來明顯影響時,稱發生了程序飢餓。當飢餓到一定程度的程序所賦予的任務即使完成也不再具有實際意義時稱該程序被餓死。死鎖是指在多道程式系統中,一組程序中的每乙個程序都無限期等待被該組程序中的另乙個程序所占有且永...