死鎖定義
死鎖是指兩個或兩個以上的程序在執行過程中,由於資源競爭或者由於彼此通訊而造成的一種阻塞現象,若無外力作用,他們都將無法推進下去,此時稱系統處於死鎖狀態,這些永遠在互相等待的程序稱為死鎖程序。
死鎖產生的四個必要條件
(1)最基本的條件是互斥條件,只有多個程序互斥的求訪問同乙個資源,才會導致某個資源不能被某些需要的程序所得到
(2)請求和保持條件:對於請求和保持條件我們可以這樣理解,要產生死鎖是由於申請資源的程序本身都已經擁有了一部分資源,而同時又去申請另外一些程序占有的自己所必須的條件,這樣每個程序都在等待申請其他程序的資源,導致所有的程序都陷入到死等中;
(3)不可搶占條件:對於不可搶占條件也很容易理解,試想一下如果程序中有搶占的條件的話,那麼優先順序高的程序就會搶占到優先順序低的程序的資源,這顯然是不符合死鎖的定義的,因此不可搶占條件是必不可少的;
(4)迴圈等待條件:為了方便我們的理解,可以以兩個程序為例,類似於scoped_ptr中的迴圈引用問題;
死鎖解除和避免演算法:
本質:因為死鎖必須滿足四個必要條件,因此死鎖的解除和避免主要是從破壞死鎖的四個必要條件入手;
預防死鎖
一般來說互斥條件是無法破壞的,所以在解除或者預防死鎖時主要從其他三個方面入手
(1)破壞請求和保持條件
第一種協議:在所有程序開始執行之前,必須一次性的申請其在整個執行過程中的所有資源,這樣便破壞了請求條件;只要乙個程序中有乙個資源不滿足,必須釋放他所占有的資源,這樣便破壞了保持條件;
第二種協議:第二種協議是第一種協議的改進,它允許程序只要獲得執行初期所需的資源後,便開始執行,在執行過程中在逐步釋放已分配給自己的(破壞了保持條件),且已經用完的全部資源,然後再開始申請新的資源。
兩種協議比較:第二種協議優於第一種協議,因為第一種協議會造成資源的嚴重浪費,使資源利用率大大的降低,也會由於佔據大量資源導致其它程序的飢餓問題
(2)破壞不可搶占條件
方式一:當乙個程序已經占有了某些不可搶占的資源時,又去申請新的資源而得不到滿足時,就必須釋放自己已經保持的所有資源(類似於上面的第一種協議中破壞保持條件),待以後需要的時候再重新申請;
方式二:如果系統中的程序的優先順序不同時,當優先順序高的程序去申請優先順序低的程序所佔據的資源時,作業系統就可以搶占優先順序低的程序的資源;
(3)破壞迴圈等待條件
對系統所有資源進行線性排序並賦予不同的序號,這樣我們便可以規定程序在申請資源時必須按照序號遞增的順序進行資源的申請,當以後要申請時需檢查要申請的資源的編號大於當前編號時,才能進行申請。
解除死鎖:
常用的解除死鎖的兩種方法
(1)搶占資源:從乙個或者多個程序中搶占足夠的資源,分配給死鎖程序,用於解除死鎖;
(2)終止(或撤銷)程序:終止(或撤銷)系統中的乙個或者多個死鎖程序,直至打破死鎖迴圈環路,使系統從死鎖中解除出來。
深入理解C語言 深入理解指標
關於指標,其是c語言的重點,c語言學的好壞,其實就是指標學的好壞。其實指標並不複雜,學習指標,要正確的理解指標。指標也是一種變數,占有記憶體空間,用來儲存記憶體位址 指標就是告訴編譯器,開闢4個位元組的儲存空間 32位系統 無論是幾級指標都是一樣的 p操作記憶體 在指標宣告時,號表示所宣告的變數為指...
mysql 索引深入理解 深入理解MySql的索引
為什麼索引能提高查詢速度 先從 mysql的基本儲存結構說起 mysql的基本儲存結構是頁 記錄都存在頁裡邊 各個資料頁可以組成乙個雙向鍊錶每個資料頁中的記錄又可以組成乙個單向鍊錶 每個資料頁都會為儲存在它裡邊兒的記錄生成乙個頁目錄,在通過主鍵查詢某條記錄的時候可以在頁目錄中使用二分法快速定位到對應...
深入理解C語言 深入理解指標
關於指標,其是c語言的重點,c語言學的好壞,其實就是指標學的好壞。其實指標並不複雜,學習指標,要正確的理解指標。指標也是一種變數,占有記憶體空間,用來儲存記憶體位址 指標就是告訴編譯器,開闢4個位元組的儲存空間 32位系統 無論是幾級指標都是一樣的 p操作記憶體 在指標宣告時,號表示所宣告的變數為指...