Thuật toán phát hiện deadlock được phân thành hai loại:
- Mỗi loại tài nguyên chỉ có một thực thể: sử dụng wait-for graph hoặc resource allocation graph
- Mỗi loại tài nguyên có thể có nhiều thực thể: sử dụng resource allocation graph.
Wait-for Graph
Là một dạng độ thì dẫn xuất từ resource allocation graph bằng cách bỏ đi cách node tài nguyên và các cạnh nối với các node đó.

Gọi thực hiện định kỳ một thuật toán kiểm tra sự tồn tại của chu trình ở trong wait-for graph với độ phức tạp là (n là số node của đồ thị).
Resource Allocation Graph (RAG)
Gọi n là số tiến trình và m là số loại tiến trình.
Data Structures
Để sử dụng RAG thì ta cần các cấu trúc dữ liệu sau:
available: là một vector có độ dài làmlưu số thực thể đang sẵn sàng của các loại tài nguyên.allocation: là một ma trậnn x mlưu số lượng thực thể của từng loại tài nguyên mà đã được cấp phát cho các tiến trình.request: là một ma trậnn x mlưu số lượng thực thể của từng loại tài nguyên mà các tiến trình yêu cầu.
Steps
Các bước thực hiện thuật toán:
- Khởi tạo
finishlà một vector với kích thước làn.- Với mọi , nếu
allocation[i] != 0thìfinish[i] = False, ngược lạifinish[i] = True.
- Với mọi , nếu
- Tìm
ithỏa mãnfinish[i] = Falsevàrequest[i] <= available(hàng thứicủarequestcó giá trị nhỏ hơnavailableở tất cả các cột). Nếu tồn tạiithì nhảy đến bước 2.1, nếu không tồn tại thì nhảy đến bước 2.2.- Gán
available = available + allocation[i].- Gán
finish[i] = True. - Quay về bước 2.
- Gán
- Nếu tồn tại
isao chofinish[i] = Falsethì hệ thống đang ở trạng thái deadlock và tiến trình đang bị deadlock.
- Gán
Example 1: No Deadlock
Xét một hệ thống có:
- 5 tiến trình: , , , và .
- 3 loại tài nguyên: A (7 thực thể), B (2 thực thể) và C (6 thực thể).
Dựa trên RAG, ta có bảng trạng thái các tiến trình và tài nguyên như sau:
| Allocation | Allocation | Allocation | Available | Available | Available | Request | Request | Request | |
|---|---|---|---|---|---|---|---|---|---|
| A | B | C | A | B | C | A | B | C | |
| P0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| P1 | 2 | 0 | 0 | 2 | 0 | 2 | |||
| P2 | 3 | 0 | 3 | 0 | 0 | 0 | |||
| P3 | 2 | 1 | 1 | 1 | 0 | 0 | |||
| P4 | 0 | 0 | 2 | 0 | 0 | 2 |
Bước 1: khởi tạo finish:
finish = [False] * nIteration 1
Bước 2: tìm được i = 0 thỏa mãn điều kiện request[0] <= available.
Bước 3: gán available = available + allocation[0]:
available = (0, 0, 0) + (0, 1, 0) = (0, 1, 0)Bảng trạng thái trở thành:
| Allocation | Allocation | Allocation | Available | Available | Available | Request | Request | Request | |
|---|---|---|---|---|---|---|---|---|---|
| A | B | C | A | B | C | A | B | C | |
| P0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| P1 | 2 | 0 | 0 | 0 | 1 | 0 | 2 | 0 | 2 |
| P2 | 3 | 0 | 3 | 0 | 0 | 0 | |||
| P3 | 2 | 1 | 1 | 1 | 0 | 0 | |||
| P4 | 0 | 0 | 2 | 0 | 0 | 2 |
Gán finish[0] = True, vector finish trở thành:
finish = [True, False, False, False, False]Iteration 2
Bước 2: tìm được i = 2 thỏa mãn điều kiện.
Bước 3: cập nhật giá trị của available:
available = (0, 1, 0) + (3, 0, 3) = (3, 1, 3)Bảng trạng thái trở thành:
| Allocation | Allocation | Allocation | Available | Available | Available | Request | Request | Request | |
|---|---|---|---|---|---|---|---|---|---|
| A | B | C | A | B | C | A | B | C | |
| P0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| P1 | 2 | 0 | 0 | 0 | 1 | 0 | 2 | 0 | 2 |
| P2 | 3 | 0 | 3 | 3 | 1 | 3 | 0 | 0 | 0 |
| P3 | 2 | 1 | 1 | 1 | 0 | 0 | |||
| P4 | 0 | 0 | 2 | 0 | 0 | 2 |
Gán finish[2] = True, vector finish trở thành:
finish = [True, False, True, False, False]Iteration 3
Bước 2: tìm được i = 3 thỏa mãn điều kiện.
Bước 3: cập nhật giá trị của available:
available = (3, 1, 3) + (2, 1, 1) = (5, 2, 4)Bảng trạng thái trở thành:
| Allocation | Allocation | Allocation | Available | Available | Available | Request | Request | Request | |
|---|---|---|---|---|---|---|---|---|---|
| A | B | C | A | B | C | A | B | C | |
| P0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| P1 | 2 | 0 | 0 | 0 | 1 | 0 | 2 | 0 | 2 |
| P2 | 3 | 0 | 3 | 3 | 1 | 3 | 0 | 0 | 0 |
| P3 | 2 | 1 | 1 | 5 | 2 | 4 | 1 | 0 | 0 |
| P4 | 0 | 0 | 2 | 0 | 0 | 2 |
Gán finish[3] = True, vector finish trở thành:
finish = [True, False, True, True, False]Iteration 4
Bước 2: tìm được i = 4 thỏa mãn điều kiện.
Bước 3: cập nhật giá trị của available:
available = (5, 2, 4) + (0, 0, 2) = (5, 2, 6)Bảng trạng thái trở thành:
| Allocation | Allocation | Allocation | Available | Available | Available | Request | Request | Request | |
|---|---|---|---|---|---|---|---|---|---|
| A | B | C | A | B | C | A | B | C | |
| P0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| P1 | 2 | 0 | 0 | 0 | 1 | 0 | 2 | 0 | 2 |
| P2 | 3 | 0 | 3 | 3 | 1 | 3 | 0 | 0 | 0 |
| P3 | 2 | 1 | 1 | 5 | 2 | 4 | 1 | 0 | 0 |
| P4 | 0 | 0 | 2 | 5 | 2 | 6 | 0 | 0 | 2 |
Gán finish[4] = True, vector finish trở thành:
finish = [True, False, True, True, True]Iteration 5
Bước 2: tìm được i = 1 thỏa mãn điều kiện.
Bước 3: cập nhật giá trị của available:
available = (5, 2, 6) + (2, 0, 0) = (7, 2, 6)Bảng trạng thái trở thành:
| Allocation | Allocation | Allocation | Available | Available | Available | Request | Request | Request | |
|---|---|---|---|---|---|---|---|---|---|
| A | B | C | A | B | C | A | B | C | |
| P0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| P1 | 2 | 0 | 0 | 0 | 1 | 0 | 2 | 0 | 2 |
| P2 | 3 | 0 | 3 | 3 | 1 | 3 | 0 | 0 | 0 |
| P3 | 2 | 1 | 1 | 5 | 2 | 4 | 1 | 0 | 0 |
| P4 | 0 | 0 | 2 | 5 | 2 | 6 | 0 | 0 | 2 |
| 7 | 2 | 6 |
Gán finish[1] = True, vector finish trở thành:
finish = [True, True, True, True, True]Do không tồn tại i sao cho finish[i] = False nên hệ thống đang không có deadlock với chuỗi các tiến trình là:
Example 2: Deadlock
Giả sử ma trận request thay đổi thành như sau:
| A | B | C | |
|---|---|---|---|
| P0 | 0 | 0 | 0 |
| P1 | 2 | 0 | 2 |
| P2 | 0 | 0 | 1 |
| P3 | 1 | 0 | 0 |
| P4 | 0 | 0 | 2 |
Sau khi đáp ứng được cho thì vector available là:
available = (0, 0, 0) + (0, 1, 0) = (0, 1, 0)Vector finish sẽ là:
finish = [True, False, False, False, False]Tuy nhiên, không tồn tại i đồng thời thỏa hai điều kiện sau:
finish[i] = Falserequest[i] <= available
Vì thế, thuật toán sẽ nhảy đến bước 4.
Có thể thấy, tồn tại i = 1, 2, 3, 4 sao cho finish[i] = False. Ta kết luận: hệ thống đang có deadlock xảy ra với các tiến trình bị deadlock là:
Resources
- Slide deadlock của đại học Bách Khoa.
- Deadlock Detection with Single-Instance Resource Allocation Graph
- Deadlock Detection with Multi-Instance Resource Allocation Graph