若將執行順序換成紅字的順序:
Producer:
- 執行
P(mutex)
mutex 1->0
- 執行
P(empty)
empty 0->-1
阻塞
Consumer: - 執行
P(mutex)
mutex 0->-1
,阻塞
Producer 脫離阻塞需要先執行Consumer: V(empty)
,在執行之前又依賴於P(full)
,P(full)
的執行需要 Consumer 脫離阻塞,Consumer 脫離阻塞需要執行Producer: V(mutex)
,執行Producer: V(mutex)
需要 Producer 脫離阻塞.
形成一種環路,造成死鎖。
死鎖:多個進程由於互相等待對方持有的資源而造成都無法執行的情況。
死鎖的處理方法:
死鎖預防:
例:預防火災
破壞死鎖出現的條件
- 在進程執行前,一次性申請所有需要的資源,不會佔有資源再去申請其他資源。缺點:1. 需要預知未來,變成困難 2. 許多資源分配後很長時間後才使用,資源利用率低
- 對資源類型進行排序,資源申請必須按序進行,不會出現環路等待。缺點:仍然造成資源浪費。
死鎖避免:
例:檢測到煤氣超標,自動切斷電源
檢測每個資源請求,如果造成死鎖就拒絕
銀行家算法:
佔有資源(Allocation),需求資源(Need),可分配資源(Available)
首先Avaliable(2,3,0),可以執行P1,執行完畢釋放資源後,Avaliable(2+3,3+0,0+2),可以執行P3,執行完畢釋放資源Avaliable(5+2,3+1,2+1),以此類推。
最後執行序列爲 A選項
實現:
缺點:每次申請都執行銀行家算法 ,效率太低
死鎖檢測+恢復:
例:出現火災,拿起滅火器
檢測到死鎖出現時,讓進程釋放資源,回滾狀態
缺點:回滾實現困難。
死鎖忽略:
例:在太陽上可以對火災全然不顧
假裝沒有死鎖
死鎖出現的條件不是確定的,又可以用重啓動處理死鎖。
在大多數非專門的操作系統都使用,如Unix,Linux 和 Windows 中都沒有死鎖處理