死結與饑餓

來源:互聯網
上載者:User
在多道程式系統中,同時有多個進程並發運行,共用系統資源,從而提高了系統資源使用率,提高了系統的處理能力。但是,若對資源的管理、分配和使用不當,則會產生死結或是饑餓。所謂死結是指在多道程式系統中,一組進程中的每一個進程軍無限期等待被該組進程中的另一個進程所佔有且永遠不會釋放的資源。饑餓是指系統不能保證某個進程的等待時間上界,從而使該進程長時間等待,當等待時間給進程推進和響應帶來明顯影響時,稱發生了進程饑餓。當饑餓到一定程度的進程所賦予的任務即使完成也不再具有實際意義時稱該進程被餓死。下面我們就來分別討論一下死結與饑餓各自的特點。

 

首先是死結。

產生死結的原因主要有兩個,一是競爭資源,系統提供的資源數量有限,不能滿足每個進程的需求;二是多道程式運行時,進程推進順序不合理。由此可見,發生死結時死結進程的個數至少是兩個。我們可以舉一個最簡單的例子來瞭解一下死結:

 

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)在饑餓的情形下,系統中有至少一個進程能正常運行,只是饑餓進程得不到執行機會。而死結則可能會最終使整個系統陷入死結並崩潰。

 

總之,死結和饑餓是作業系統中亟待解決的重要問題,發明出一個令人滿意的完善的解決方案是一個誘人的且永遠不會過時的課題。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.