(作業系統) Deadlock Definition, Avoidance and Resolution
Deadlock基本概念
1. Deadlock 是什麼?
Deadlock 指的是:
一組 processes 彼此等待對方所持有的資源,導致所有 process 都無法繼續執行。
Deadlock 的特徵
- 每個 process:
- 已持有至少一個資源
- 同時等待另一個 process 持有的資源
- 結果:大家互等,系統停住
2. Deadlock 範例
Example 1:兩個 processes、兩個資源
- P1 持有 R1,等待 R2
- P2 持有 R2,等待 R1
→ 互相等待,發生 deadlock
Example 2:Semaphore A 與 B
1 | P1: wait(A); wait(B); ...; signal(B); signal(A); |
- 若 P1 先拿到 A、P2 先拿到 B
- 下一步彼此都在等對方 → deadlock
Deadlock 的四個必要條件
Deadlock 當且僅當下列四個條件同時成立:
- Mutual Exclusion(互斥)
- Hold and Wait(占有且等待)
- No Preemption(不可搶占)
- Circular Wait(循環等待)
📌 破壞其中一個條件即可避免 deadlock。
System Model(系統資源模型)
Resource Types 與 Instances
- 資源種類:R1, R2, …
- 每種資源有多個 instances(例:2 CPUs)
Resource Usage Pattern
- Request
- Use
- Release
Resource-Allocation Graph(RAG)
圖的元素
- Process:圓形
- Resource Type:矩形
- Instance:矩形內的點
邊的種類
- Request edge:P → R
- Assignment edge:R → P

Cycle 與 Deadlock 關係
- 單一 instance:Cycle ⇒ Deadlock
- 多 instances:Cycle 為必要但非充分
Deadlock Detection
- 無 cycle:無 deadlock
- 有 cycle:
- 單一 instance ⇒ deadlock
- 多 instances ⇒ 需進一步分析
- P2、P4不在Cycle,不會DeadLock

- 會DeadLock

Deadlock 處理策略
- Prevention / Avoidance
- Detection & Recovery
- Ignore(Ostrich Algorithm) (通常用這個因為前面成本太高,而且DeadLock頻率不高)
Deadlock Prevention
Deadlock Prevention 的核心概念是:
👉 確保四個必要條件中,至少有一個「不成立」,使 deadlock 不可能發生。
1. Preventing Mutual Exclusion(破壞互斥)(做不到)
方法
- 允許資源共享(只要可行)
- 對「可共享資源」不強制 mutual exclusion
範例
- Read-only files 可被多個 processes 同時存取
限制
- 許多資源本質上不可共享:
- Printers
- Tape drives
- File write access
結論
- 適用範圍有限
- 不是通用解法
2. Preventing Hold and Wait(破壞占有且等待)(有效率但沒效能)
核心想法
- 不允許 process 在「持有資源」時再等待其他資源
Protocol 1:Request all at once (全拿or全不拿)
- Process 必須在開始前一次請求所有所需資源
- 未取得全部資源前,不得持有任何資源
Protocol 2:Release before request (用前先Release)
允許持有部分資源
- Process 只有在「未持有任何資源」時才能請求新資源
- 若需新資源,必須先釋放目前全部資源
優點
- 能有效防止 deadlock
缺點
- 低資源使用率
- 可能產生 starvation (要很多Process 要 等待所有的Process)
- 程式不一定事先知道所需資源
3. Preventing No Preemption(破壞不可搶占)(可以使用,實作有限,效能損失)
核心想法
- 允許系統強制回收(preempt)資源
Protocol 1:Preempt waiting process
- 若 process 持有資源且請求新資源失敗:
- 回收該 process 所有資源
- 該 process 重新等待舊資源與新資源
- 你既然要等,那你先把你手上的資源通通吐出來
Protocol 2:Preempt holder of requested resource
- 若 P1 請求的資源 R 被 P2 持有:
- 若 P2 正在等待其他資源 → preempt R
- 表示 P2 自己也卡住了 → 可以把 R 從 P2 手上搶走給 P1
- 否則 P1 等待
- 表示 P2 很可能快做完、快釋放 , 讓 P1 等,不要搶
- 若 P2 正在等待其他資源 → preempt R
適用資源
-
whose state can be easily saved and restored
✅ CPU registers
✅ Memory(swap)
✅ Database locks(rollback) -
whose state cannot be easily saved and restored
❌ Printers (cannot undo)
❌ Tape drives
❌ CD/DVD burners
4. Preventing Circular Wait(破壞循環等待)
方法:資源排序(Total Ordering)
- 為每種資源指定唯一編號 F(Ri)
- Process 必須依照編號遞增順序請求資源
Resource Request Rule
- 若 process 已持有 Ri
- 只能請求滿足 F(Rj) > F(Ri) 的資源
- 要 2,4 ,需要先拿2再拿4
Alternative Protocol
- 請求 Rk 前,先釋放所有 F(Ri) ≥ F(Rk) 的資源
F(R0) 不可能 < F(R0)
優點
- 有效防止 circular wait
- Runtime overhead 低
缺點
- 可能Starvation
- 低的CPU utilization、Throughput
- 小的號碼很搶手
- 排序設計困難
- 可能限制資源請求彈性
做法以及例子
- OS 會賦予每一類型資源一unique resource No/ID
- 必須按照Ascending方式提出申請
例子 :
|持有|申請|OK?|
|R0|R3|OK|
|R0,R5|R3|必須先Release R5才能提R3|
Deadlock Avoidance(死結避免)
核心概念
- 系統在分配資源前進行檢查
- 確保永遠不進入 unsafe state
Algorithm Selection
Case 1:Single Instance per Resource Type
- 使用 Resource-Allocation Graph(RAG)
- 檢查是否產生 cycle
Case 2:Multiple Instances per Resource Type
- 使用 Banker’s Algorithm
- 檢查是否存在 safe sequence
Safe State(安全狀態)
- Safe state:存在某種資源配置順序,使所有 process 可完成
- Safe ⇒ 一定不會 deadlock
- Unsafe ⇒ deadlock 可能發生(但不一定)
Avoidance 的目標
👉 系統永遠不進入 unsafe state
Resource-Allocation Graph (RAG) Algorithm
一、RAG Algorithm 在做什麼?
RAG Algorithm 是 Deadlock Avoidance 的方法之一,
適用於 每種資源只有一個 instance(single instance per resource type) 的系統。
👉 核心想法:
在資源真正分配前,先檢查是否會形成 cycle,避免系統進入 deadlock。
二、Graph Components(圖的邊種類)
1. Request Edge(實線)
Pi → Rj
- Process Pi 正在請求資源 Rj
- 表示目前尚未被滿足的請求
2. Assignment Edge(實線)
Rj → Pi
- 資源 Rj 已分配給 Process Pi
- 表示 Pi 正在持有並使用該資源
3. Claim Edge(虛線)
Pi ⇢ Rj
- Process Pi 未來可能會請求 資源 Rj
- 表示潛在的最大需求
📌 重要規定:
- Claim edge 必須在 process 執行前就宣告
- 系統必須事先知道 process 的最大資源需求
三、Edge Transitions(邊的轉換)
Transition 1:Claim → Request
- 當 Pi 實際開始請求 Rj
- 虛線 claim edge 轉為實線 request edge
Transition 2:Request → Assignment
- 當系統核准請求並分配資源
- request edge 轉為 assignment edge
Transition 3:Assignment → Claim
- 當 Pi 釋放資源 Rj
- assignment edge 轉回 claim edge

四、Deadlock Avoidance Protocol(RAG 演算法流程)
前提條件
- 所有 claim edges 必須在 process 開始前建立
當 Process Pi 請求資源 Rj 時:
-
假設分配
- 將 claim → request → assignment(假想)
-
Cycle 檢查
- 使用 cycle-detection algorithm(時間複雜度 O(n²))
-
判斷結果
- ✅ 若 不產生 cycle:允許分配(safe)
- ❌ 若 會產生 cycle:拒絕請求,process 等待(unsafe)
五、Key Insight(關鍵觀念)
在 single instance per resource type 的系統中:
Cycle ⇔ Deadlock
因此:
- 防止 cycle
- 就能保證系統不會發生 deadlock
六、為什麼資源「現在空著」也不能給?
即使某資源目前未被使用:
- 若分配後會形成 cycle
- 在單一 instance 系統中就等同於 deadlock
👉 RAG Algorithm 是預防未來死結,而不是只看當下。
Deadlock Avoidance:Safe State Concept
一、核心概念:Safe vs. Unsafe
Deadlock Avoidance 的根本思想在於區分 Safe state 與 Unsafe state。
Safe State(安全狀態)
系統若存在一個 process 執行順序:
<P1, P2, …, Pn>,使得對每個 Pi:
- Pi 尚需的資源 ≤(目前可用資源 + 所有 Pj(j < i)完成後釋放的資源)
- 若 Pi 無法立即取得資源,則等待前面的 Pj 完成
- Pi 完成後會釋放其資源,供後續 process 使用
👉 此順序稱為 Safe Sequence
Safe / Unsafe / Deadlock 關係(必考)
- Safe state ⇒ 一定不會 deadlock
- Unsafe state ⇒ 可能 deadlock(但不一定)
- Deadlock ⇒ 一定是 unsafe state
📌 Deadlock Avoidance 的策略:
👉 確保系統隨時維持在 safe state
Safe State with Safe Sequence(範例解析)
系統設定
- 總共有 12 台 tape drives
- Process 與需求如下:
| Process | Max Needs | Current Holding |
|---|---|---|
| P0 | 10 | 5 |
| P1 | 4 | 2 |
| P2 | 9 | 2 |
目前 Available = 12 − (5 + 2 + 2) = 3
判斷 Safe Sequence:⟨P1, P0, P2⟩
Step 1:P1
- Need(P1) = 4 − 2 = 2
- Available = 3 ≥ 2 ✅
- P1 完成後釋放 2
→ Available = 3 + 2 = 5
Step 2:P0
- Need(P0) = 10 − 5 = 5
- Available = 5 ≥ 5 ✅
- P0 完成後釋放 5
→ Available = 5 + 5 = 10
Step 3:P2
- Need(P2) = 9 − 2 = 7
- Available = 10 ≥ 7 ✅
- P2 完成後釋放 2
→ Available = 12
結論
- 存在 Safe Sequence:⟨P1, P0, P2⟩
- 👉 系統處於 Safe State
Unsafe State(沒有 Safe Sequence)
系統狀態(t1)
| Process | Max Needs | Current Holding |
|---|---|---|
| P0 | 10 | 5 |
| P1 | 4 | 2 |
| P2 | 9 | 3 |
Available = 12 − (5 + 2 + 3) = 2
分析
- Need(P0) = 5 > 2 ❌
- Need(P1) = 2 ≤ 2(但釋放後仍不足以滿足其他 process)
- Need(P2) = 6 > 2 ❌
👉 不存在任何 Safe Sequence
結論
- 系統進入 Unsafe State
- Deadlock 可能發生(但尚未發生)
📌 Deadlock Avoidance 原則:
👉 只有在資源分配後仍為 Safe State,請求才會被允許
Deadlock-Free 的充分條件(單一 Resource Type)
假設:
m:系統中相同 Resource 的總數n:Process / Thread 數量Max_i:第i個 Process 最大需要的 Resource 數量
若:
$$
\sum_{i=1}^{n}(Max_i - 1) < m
$$
則可以保證系統 Deadlock Free。
等價寫法:
$$
\sum_{i=1}^{n} Max_i < m+n
$$
為什麼?
假設 m 個 Resources 全部分配出去:
Σ Allocation_i = m
因為:
$$
Need_i = Max_i - Allocation_i
$$
所以:
$$
Σ Need_i= Σ Max_i - m< n
$$
因為共有 n 個 Processes,而 Σ Need_i < n,
所以至少有一個 Process:
Need_i = 0
→ 該 Process 一定可以完成
→ 完成後釋放 Resources
→ 其他 Process 便可繼續完成
→ 因此系統 Deadlock Free
Example
4 個相同 Resources,N 個 Threads,
每個 Thread 最多需要 2 個:
m = 4
Max_i = 2
$$
Σ Max_i < m + n
$$
2N < 4 + N
N < 4
∴ 最多 3 個 Threads 可保證 Deadlock Free
Banker’s Algorithm
一、用途與適用情境
- Deadlock Avoidance(死結避免) 演算法
- 適用於:每種資源有「多個 instances」的系統
- 核心原則:
只有在分配後仍然存在 Safe Sequence,才允許資源分配
二、資料結構(一定要會)
對每個 process Pi 與每種資源型別(A, B, C…):
- Max[i]:Pi 宣告的最大需求量
- Allocation[i]:目前已分配給 Pi 的資源量
- Need[i] = Max[i] − Allocation[i]
- Available:系統目前可用的資源量
三、Safety Algorithm(安全性檢查)
目標
判斷「目前狀態是否為 Safe State」,並找出 Safe Sequence(若存在)。
步驟
-
初始化
Work = AvailableFinish[i] = false(對所有 i)
-
尋找可完成的 process
- 找一個
Finish[i] == false且Need[i] ≤ Work的 Pi - 若找不到 → 跳到步驟 4
- 找一個
-
模擬完成
Work = Work + Allocation[i]Finish[i] = true- 記錄 Pi 到 Safe Sequence
- 回到步驟 2
-
判斷
- 若所有
Finish[i] == true→ Safe - 否則 → Unsafe
- 若所有
四、Safety Algorithm 範例(逐步跑表)
系統資源
- Total instances:A=10, B=5, C=7
- Initial Available:A=3, B=3, C=2
初始表格
| Process | Max (A B C) | Allocation (A B C) | Need (A B C) |
|---|---|---|---|
| P0 | 7 5 3 | 0 1 0 | 7 4 3 |
| P1 | 3 2 2 | 2 0 0 | 1 2 2 |
| P2 | 9 0 2 | 3 0 2 | 6 0 0 |
| P3 | 2 2 2 | 2 1 1 | 0 1 1 |
| P4 | 4 3 3 | 0 0 2 | 4 3 1 |
Step-by-step Safe Sequence
-
P1:Need(1,2,2) ≤ Available(3,3,2) ✔
- Work = (3,3,2) + (2,0,0) = (5,3,2)
-
P3:Need(0,1,1) ≤ (5,3,2) ✔
- Work = (5,3,2) + (2,1,1) = (7,4,3)
-
P4:Need(4,3,1) ≤ (7,4,3) ✔
- Work = (7,4,3) + (0,0,2) = (7,4,5)
-
P2:Need(6,0,0) ≤ (7,4,5) ✔
- Work = (7,4,5) + (3,0,2) = (10,4,7)
-
P0:Need(7,4,3) ≤ (10,4,7) ✔
結論
- Safe Sequence:⟨P1, P3, P4, P2, P0⟩
- 系統處於 Safe State
五、Resource-Request Algorithm(請求檢查)
當 Process Pi 提出請求 Request[i] 時:
檢查順序
Request[i] ≤ Need[i](不可超過最大需求)Request[i] ≤ Available(系統必須有資源)- 假設分配後,執行 Safety Algorithm
- 若 Safe → 允許分配
- 若 Unsafe → 拒絕請求(等待)
六、請求範例(Safe)
- Available:A=2, B=3, C=0
- Request(P1) = (1,0,2)
檢查:
- Request ≤ Need ✔
- Request ≤ Available ✔
- Safety check 後仍有 Safe Sequence
👉 允許請求,系統仍為 Safe State
七、請求範例(Unsafe)
- Available:A=0, B=0, C=2
- Request(P4) = (3,3,0)
檢查:
- Request ≤ Need ✔
- Request ≤ Available ❌ 或 Safety check 失敗
👉 拒絕請求(會進入 Unsafe State,無 Safe Sequence)
八、時間複雜度 $O(n^2*m)$
主要耗時在Safety Algorithm 中 : 2、3 Loop
- n : Process數量
- m : Resources Type數量
ex :
- n = 5 : $P_0$ ~ $P_4$
- m = 3 : A、B、C
| Process | Allocation | Need |
|---|---|---|
| P0 | (0,1,0) | (7,4,3) |
| P1 | (3,0,2) | (0,2,0) |
| P2 | (3,0,2) | (6,0,0) |
| P3 | (2,1,1) | (0,1,1) |
| P4 | (0,0,2) | (4,3,1) |
- 一開始Work = Avalible = (2,3,0)
- 第一輪
- (0,1,0) + (2,3,0) >= (7,4,3)?
- 第二輪
- (3,0,2) + (2,3,0) >= (0,2,0)?
- 一直重複
那每輪都要比3種Resources合不合理 => O(m)
那每輪最多檢查 n 個 => n-1 個 => … => 1個 : 因為掃到最後一個才成功
所以 => n + n-1 + n-2 + n-3 + n-4 + … + 1 = n(n+1) / 2 => $O(n^2)$
最終 :
$$
O(n^2*m)
$$
Deadlock Detection(死結偵測)
一、Deadlock Detection 的核心概念
與 Prevention / Avoidance 不同,Deadlock Detection 的策略是:
允許 deadlock 發生,再定期偵測並處理。
適合用在:
- Deadlock 發生頻率低
- 預防與避免成本太高的系統
二、Algorithm 1:Wait-For Graph(單一 instance)
適用情境
- 每種資源只有一個 instance
- 可將 Resource-Allocation Graph(RAG)簡化

Wait-For Graph(WFG)
- 節點:Processes(P1, P2, …)
- 邊:
Pi → Pj- 表示 Pi 正在等待 Pj 釋放資源

建立方式
- 從 RAG 中:
- 移除 resource nodes
- 若
Pi → R → Pj,則建立Pi → Pj
偵測方式
- 定期對 WFG 進行 cycle detection
- 判斷規則:
- 無 cycle → 無 deadlock
- 有 cycle → deadlock 存在
📌 在單一 instance 系統中:
Cycle ⇔ Deadlock
三、Algorithm 2:Detection with Banker’s Algorithm(多個 instances)
時間複雜度 $O(m*n^2)$
- 最多檢查 n + (n-1) + … + 1 =$O(n^2)$
- 每次check 花 O(m)
適用情境
- 每種資源有多個 instances
- 與 Banker’s Algorithm 類似,但用途不同
資料結構
- Allocation:目前配置資源
- Request:尚未滿足的請求
- Available:系統可用資源
概念
- 嘗試找出一個 sequence,使所有 process 都能完成
- 若找不到 → 系統發生 deadlock
範例說明
- Total instances:A=7, B=2, C=6
- Available:A=0, B=0, C=0
若存在 safe-like sequence:
<P0, P2, P3, P1, P4>
→ 系統沒有 deadlock
若某 process(如 P2)提出額外請求而:
- 無法找到任何 sequence
→ Deadlock detected
Deadlock Recovery(死結復原)
一、Recovery 的基本原則
一旦 deadlock 被偵測到:
必須破壞 deadlock cycle,使系統能繼續運作。
二、Method 1:Process Termination(終止行程)
作法
- Abort all deadlocked processes
- 快速但代價大
- Abort one process at a time
- 每終止一個就重新檢查是否仍有 deadlock
Victim Selection(考試重點)
選擇哪個 process 終止?常見考量:
- Process 優先權
- 已執行時間
- 尚需多少資源
- 佔用資源數量
- 是否為互動式或背景程式
三、Method 2:Resource Preemption(資源搶占)
步驟
- Select a victim
- 決定從哪個 process 搶資源
- Rollback
- 將 process 回復到安全狀態
- Starvation prevention
- 避免同一個 process 一直被犧牲
Resource Preemption 的問題
- 哪些資源適合搶占?
- Rollback 成本高
- 必須防止 starvation
Deadlock 的本質是「資源分配順序錯誤」;作業系統不是預防它、避免它,就是在發生後偵測並打破它。