死結
死結復原(deadlock recovery)
假設偵測剛確認了一場連環卡死:一群行程凍結,每個都緊抓著別人需要的資源。知道塞住了並不能疏通它——你仍得把車子實際拖出路口,交通才能再流動。死結復原就是那個清理步驟:作業系統在偵測到死結後,為打斷環、讓倖存者繼續而刻意採取的行動。
復原大致有兩種方法。第一是終止行程(process termination):終止一個或多個死結中的行程以釋放其資源。你可以一次中止所有死結行程(激烈但確定),或一次中止一個、每次終止後重跑偵測直到死結解開(較不浪費但較慢)。第二是資源剝奪(resource preemption):強行把資源從某些行程奪走交給別人,這引出三個子問題——選擇受害者(以最小代價,從誰那裡奪走哪些資源)、回復(被剝奪的行程必須重設到較早的安全檢查點,因為它無法在沒有該資源下直接繼續)、以及飢餓(必須避免永遠反覆挑中同一個受害者)。
復原無可避免地既麻煩又有損失,這正是許多系統寧可根本別走到這一步的誠實理由。終止行程會丟掉它的工作;若它正更新檔案或資料庫到一半,除非交易能乾淨地回復,否則可能留下不一致的資料。選擇受害者是個沒有完美答案的成本最佳化:可依優先權、已執行時間、持有資源數量、距離完成的遠近來挑。而回復需要系統先做過狀態檢查點,維護它代價不小——所以復原是一件真實但粗糙的工具,而非免費的還原按鈕。
在 P1、P2、P3 之間偵測到死結後,作業系統中止優先權最低、進度最少的行程(比方 P3),收回其鎖。接著重跑偵測;若環已消失,P1 與 P2 繼續;若沒有,就中止下一個受害者。
以逐一終止受害者、每次後重新檢查的方式復原,直到死結解開。
復原有損失:終止行程會丟掉它的工作,並可能讓共享資料變得不一致;而資源剝奪需要回復到檢查點,並須小心別反覆餓死同一個受害者。
又称
另见