電腦店訊 死結是多執行緒/多程序環境中最棘手的並發問題之一。本文從生活化範例切入,系統梳理死結的四個必要條件、建模定義、四大經典應對策略(鴕鳥演算法、偵測與恢復、避免、預防),並說明銀行家演算法等核心機制,最後總結:無完美方案,唯有因地制宜。
程序 A 佔用掃描儀、請求燒錄機;程序 B 佔用燒錄機、請求掃描儀。雙方各執一資源、互求對方資源,形成循環等待,誰也無法繼續——這就是死結。
若一組程序中,每個程序都在等待只能由該組內其他程序觸發的事件,則該組程序處於死結。換句話說:每個程序都需要額外資源才能繼續,但持有那些資源的程序因資源不足而無法釋放,形成閉環。
四條件同時成立才會死結;破壞任一條件即可預防。
源於鴕鳥遇危險埋頭沙中假裝沒事。工程觀點:若死結機率極低、處理成本極高,不處理反而划算。許多商業作業系統(早期 UNIX、Windows)對一般使用者採此策略。
核心概念:安全狀態——即使所有程序突然請求最大資源需求,仍存在某種調度順序讓所有程序跑完。每次資源請求前模擬分配,若分配後仍處於安全狀態則允許,否則拒絕/延遲。缺點:需預知最大需求、計算開銷大。
| 破壞條件 | 方法 | 缺點 |
|---|---|---|
| 互斥 | 假離線技術模擬共享 | 僅適用部分資源 |
| 佔有並等待 | 程序啟動前一次申請所有資源 | 資源利用率低、可能飢餓 |
| 不可搶佔 | 允許搶佔(配合假離線) | 實作複雜 |
| 循環等待 | 資源統一編號,按序請求 | 限制程式設計彈性 |
沒有銀彈。實務上常混合策略:關鍵系統用避免/預防,一般系統用鴕鳥演算法+偵測恢復。工程師需根據系統關鍵性、資源類型、負載特性,量身打造死結管理方案。