三.死鎖處理
在生產者-消費者模型中可能出現的問題:
在該模型中,我們設定了兩組訊號量,一組用來表示可呼叫資源的個數,另一組用來保證程序互斥。如果我們將互斥訊號量mutex和資源訊號量empty,full按照圖示順序編寫,就可能導致死鎖的產生。
我們不妨設當前資源訊號量為0,那麼我就說執行生產者程序時,mutex變為0,empty變為-1,生產者程序阻塞;此時呼叫消費者程序,mutex變為-1,消費者程序也阻塞;這就是死鎖的產生。
死鎖的定義
:多個程序由於互相等待對方持有的資源而造成誰都無法繼續執行的情況。
程序涉及的資源是非共享的,只能同時供乙個程序使用。
乙個程序執行過程中不能搶占另乙個程序所持有的資源
乙個程序申請呼叫其他資源時依然會占有自己已經持有的資源
在資源分配圖中存在乙個環路,環路中每乙個程序持有的資源同時被下乙個程序所請求。
通過限制條件去破壞死鎖的四個必要條件中的乙個或多個,從源頭上預防死鎖的產生。
該方法的實現較為簡單,但是以一種悲觀鎖的心態去預防死鎖的產生降低了系統利用率。
具體做法:
1.在一開始便申請完成乙個程序所需的所有資源。通過某種方法測試每個資源的請求是否會讓系統進入不安全狀態,如果會則拒絕執行。2.按照一定的次序對資源申請進行排序,破壞環路等待條件。
該方法因為事先並沒有設定很強的限制措施,得到了較高的系統資源利用率和系統吞吐量,但是在實現上存在困難。
安全狀態
:如果系統能夠按照某種資源分配順序使得所有程序都能執行完成,則該系統此時處於安全狀態。
對應的序列就叫做安全序列
。若不存在這樣乙個安全序列則稱該系統處於不安全狀態
。
安全序列的尋找
:
如圖所示可能的一種安全序列為:p3->p1->p4->p2->p0
對應的演算法實現(銀行家演算法):
既不事先設定限制條件預防死鎖的發生,也不對可能造成死鎖的資源請求進行檢測,而是在死鎖發生之後讓一些程序回滾,讓出資源。
同樣能得到較高的資源使用率,但在實現上存在困難。
死鎖避免中使用的銀行家演算法由於系統中的資源數目和程序數目過多,時間複雜度過高,導致了額外的系統開銷。為了解決這個問題,我們可以選擇定時檢測或在資源利用率低時檢測的方法來減少系統開銷,然後再通過業務回滾處理死鎖。
對於pc機這種重啟影響不大的情況下,可以選擇忽略死鎖,直接重啟所有程序。
死鎖,死鎖的產生條件,死鎖的處理策略
死鎖 兩個或兩個以上的程序在執行過程中,因爭奪資源而產生互相等待的現象,若無外力作用,它們都將無法推進,此時系統處於死鎖狀態或系統產生了死鎖,這些永遠在互相等待的程序稱為死鎖程序。產生條件 1.互斥條件 乙個資源每次只能被乙個程序使用 2.請求與保持條件 乙個程序因請求資源而阻塞時,對已獲得的資源保...
死鎖產生的條件和處理死鎖的方法
死鎖 deadlock 就是指兩個或兩個以上的程序在執行的過程中,由於競爭資源或者由於彼此通訊而造成的一種阻塞的現象,若無外力作用,它們都將無法推進下去,此時稱系統處於死鎖狀態或系統產生了死鎖,這些永遠在互相等待的程序稱為死鎖程序。若可能發生死鎖,則必定要出現三個條件 1.互斥條件 指程序對所分配的...
死鎖的產生與解決
死鎖 所謂死鎖,是指在多道程式系統中,指兩個或兩個以上的程序在執行過程中,由於競爭資源或者由於彼此通訊而造成的一種阻塞的現象,若無外力作用,它們都將無法推進下去。產生死鎖的主要原因有兩個 一是競爭資源 二是多道程式執行時,程序推進順序不合理。1.產生死鎖的四個必要條件 1 互斥條件 指程序對所分配到...