什麼是死鎖?
多個進程由於互相等待對方持有的資源而造成的誰都無法執行的情況叫死鎖
舉個栗子
在這樣一個四條路交叉的情況下:車A佔有了路4,請求進入路1,而路1被車B佔有,車B請求進入路2,路2又被車C佔有;
車C申請進入路3,而路3被車D佔有,車D請求進入路4,只有進入了路4,車D現在佔有的路3纔會被釋放。其他車輛也是隻有進入了想申請的路,現在佔有的路纔會被釋放。四輛車各自佔有的路和互相申請的路形成了環路等待,誰也不能進一步開動。
死鎖的成因
從上面的例子中,可以看出死鎖的一些成因
資源互斥使用,一旦佔有別人無法使用(路)
進程佔有了一些資源,又不去釋放,再去申請其他資源
各自佔有的資源和互相申請的資源形成了環路等待
總結一下死鎖的4個必要條件
- 互斥使用
資源的固有特性,如道路口 - 不可搶佔
資源只能自願放棄,如車開走以後 - 請求和保持
進程必須在佔有一些資源(路)的情況下,再去申請另一些資源(另一條道路) - 循環等待
在資源分配圖中存在一個環路
死鎖的處理方法
死鎖預防,即破壞死鎖出現的條件層面
在進程執行前,一次性申請所有需要的資源,不會佔有資源再去申請其他資源
缺點1:需要預知未來,編程苦難
缺點3:許多資源分配後很長時間後才使用,資源利用率低
對資源類型進行排序,資源申請按序進行,不會出現環路等待
缺點:仍然造成資源浪費
死鎖避免層面:每次申請資源前,判斷此次申請是否會造成死鎖(銀行家算法,費時),如果會造成死鎖則此次申請被拒絕
死鎖檢測+恢復:發現問題再處理
定時檢測或者是發現資源利用率低時檢測,如果出現死鎖,讓一些進程回滾(恢復成執行前的樣子),然後讓出資源
死鎖忽略:許多通用操作系統,如PC機上安裝的windows和Linux,都採用死鎖忽略的方法,即出現死鎖時重啓(相當於重新來過)