|
產生死鎖的原因主要有兩個,一是競爭資源,系統提供的資源數量有限,不能滿足每個進程的需求;二是多道程序運行時,進程推進順序不合理。由此可見,發(fā)生死鎖時死鎖進程的個數至少是兩個。我們可以舉一個最簡單的例子來了解一下死鎖:
假如雙方都擁有部分資源(P1擁有A,P2擁有B,且A,B均只有一個),但這時P1還需要B,P2還需要A,于是P1與P2都會處在無限等待狀態(tài),發(fā)生了死鎖。 由這個例子,我們可以歸納分析出產生死鎖的必要條件: (1) 資源是獨占的且排他使用。即任意時刻一個資源只能給一個進程使用,其他申請者只有等待,直到資源被占有者釋放。如例子中的A,B資源。 (2) 進程所獲得的資源在未使用完畢之前,不能被其他進程強行剝奪,而只能由擁有該資源的進程自愿釋放。如例子中P2 不能強占P1擁有的A資源,而P1也不能強占P2擁有的B資源。 (3) 進程每次申請他所需要的一部分資源,在申請新的資源的同時,繼續(xù)占用已分配到的資源。如例子中P1申請B資源時繼續(xù)占有A資源,P2申請A資源時繼續(xù)占有B資源。 (4) 在發(fā)生死鎖時,必然存在一個進程等待環(huán)路,環(huán)路中的每一個進程已占有的資源同時被另一個進程所申請。如例子中的P1和P2就是一個簡單的等待環(huán)路。 系統發(fā)生死鎖不僅浪費了大量的系統資源,甚至會導致整個系統的崩潰,因此如何解決死鎖問題是操作系統設計中的一個重點。目前主要有兩類方法,一類是不讓死鎖發(fā)生;另一類是讓死鎖發(fā)生,再加以解決。 死鎖預防就是力圖不讓死鎖發(fā)生,它采用破壞“不可剝奪”條件,或破壞“請求保持”條件,或破壞“循環(huán)等待”條件來達到目的,但這種方法給系統加上了較強的限制條件,嚴重的影響了系統性能。死鎖避免則是不破壞死鎖的必要條件,而是系統對進程發(fā)出的每一個系統能夠滿足的資源申請進行動態(tài)檢驗,并根據檢驗結果決定是否分配資源,如果分配后系統可能發(fā)生死鎖,則不分配,否則分配。 這種方法算法復雜,會消耗很多的系統時間。 由于饑餓和餓死與資源分配策略有關,因而解決饑餓與餓死問題可從資源分配策略的公平性考慮,確保所有進程不被忽視。如時間片輪轉算法(RR)。它將CPU的處理時間分成一個個時間片,就緒隊列中的諸進程輪流運行一個時間片,當時間片結束時,就強迫運行程序讓出CPU,該進程進入就緒隊列,等待下一次調度。同時,進程調度又去選擇就緒隊列中的一個進程,分配給它一個時間片,以投入運行。如此方式輪流調度。這樣就可以在不考慮其他系統開銷的情況下解決饑餓的問題。 最后,我們來比較的看一下死鎖與饑餓。 死鎖與餓死有一定相同點:二者都是由于競爭資源而引起的。但又有明顯差別: (1) 從進程狀態(tài)考慮,死鎖進程都處于等待狀態(tài),忙式等待(處于運行或就緒狀態(tài))的進程并非處于等待狀態(tài),但卻可能被餓死; (2) 死鎖進程等待永遠不會被釋放的資源,餓死進程等待會被釋放但卻不會分配給自己的資源,表現為等待時限沒有上界(排隊等待或忙式等待); (3) 死鎖一定發(fā)生了循環(huán)等待,而餓死則不然。這也表明通過資源分配圖可以檢測死鎖存在與否,但卻不能檢測是否有進程餓死; (4) 死鎖一定涉及多個進程,而饑餓或被餓死的進程可能只有一個。 |
|
|
來自: Frank Library > 《信息技術》