死鎖產生
1、互斥條件 每一資源或者被分配給一個進程,或者空閒。
2、占有並請求條件 已分配到了一些資源的進程可以申請新的資源
3、不可剝奪條件 已分配給某些進程的資源不可被剝奪,只能有占有它的進程使用完後主動釋放
4、循環等待條件 系統必然存在一條有兩個或兩個以上的進程組成的循環,聯眾的每一個進程都在等待相鄰進程所占用的資源
死鎖預防
破壞“互斥”條件
就是在系統里取消互斥。若資源不被一個進程獨占使用,那么死鎖是肯定不會發生的。
但一般來說在所列的四個條件中,“互斥”條件是無法破壞的。因此,在死鎖預防里主要是破壞其他幾個必要條件,而不去涉及破壞“互斥”條件。
.破壞“占有並等待”條件
破壞“占有並等待”條件,就是在系統中不允許進程在已獲得某種資源的情況下,申請其他資源。即要想出一個辦法,阻止進程在持有資源的同時申請其他資源。
方法一:
創建進程時,要求它申請所需的全部資源,系統或滿足其所有要求,或什麼也不給它。這是所謂的 “ 一次性分配”方案。
方法二:
要求每個進程提出新的資源申請前,釋放它所占有的資源。這樣,一個進程在需要資源S時,須先把它先前占有的資源R釋放掉,然後才能提出對S的申請,即使它可能很快又要用到資源R。
破壞“不可搶占”條件
破壞“不可搶占”條件就是允許對資源實行搶奪。
方法一:如果占有某些資源的一個進程進行進一步資源請求被拒絕,則該進程必須釋放它最初占有的資源,如果有必要,可再次請求這些資源和另外的資源。
方法二:如果一個進程請求當前被另一個進程占有的一個資源,則作業系統可以搶占另一個進程,要求它釋放資源。只有在任意兩個進程的優先權都不相同的條件下,方法二才能預防死鎖。
破壞“循環等待”條件
破壞“循環等待”條件的一種方法,是將系統中的所有資源統一編號,進程可在任何時刻提出資源申請,但所有申請必須按照資源的編號順序(升序)提出。這樣做就能保證系統不出現死鎖。