Definition
Là một thuật toán tránh deadlock (xem thêm Deadlock Avoidance). Nó còn được dùng để phát hiện xem deadlock có xảy ra trong tương lai hay không.
- Mỗi tiến trình phải khai báo số lượng thực thể (instance) tối đa của một loại tài nguyên mà nó cần.
- Khi tiến trình yêu cầu tài nguyên thì có thể cần phải đợi mặc dù tài nguyên được yêu cầu đang có sẵn.
- Khi tiến trình đã có đủ tài nguyên thì phải hoàn trả trong một thời gian hữu hạn nào đó.
Implementation
Gọi n là số tiến trình và m là số loại tài nguyên.
Data Structures
Khởi tạo các cấu trúc dữ liệu sau:
available: là một vector có độ dài làmlưu số lượng thực thể đang sẵn sàng của các loại tài nguyên.max: là một ma trậnn x mlưu số lượng thực thể tối đa mà các tiến trình cần.allocation: là một ma trậnn x mlưu số lượng thực thể mà các tiến trình đang nắm giữ.need: là một ma trậnn x mlưu số lượng thực thể mà các tiến trình cần (need = max - allocation)
Steps
Các bước của thuật toán:
- Gọi
finishlà vector có độ dài làn.- Khởi tạo
finish[i] = False(với )
- Khởi tạo
- Tìm
itheo thứ tự từ0đếnnthỏafinish[i] = Falsevàneed[i] <= available(hàng thứicủaneedcó 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
finish[i] = Truevới mọi thì hệ thống đang ở trạng thái safe. Ngược lại, nếu tồn tại ít nhất một giá trị củaisao chofinish[i] = Falsethì hệ thống đang ở trạng thái unsafe.
- Gán
Độ phức tạp thời gian là .
Example
Xét một hệ thống có:
- 5 tiến trình: , , , và .
- 3 loại tài nguyên: A (10 thực thể), B (5 thực thể) và C (7 thực thể).
Ta có:
n = 5, m = 3Bảng cho biết trạng thái cấp phát tài nguyên của hệ thống ở thời điểm :
| Allocation | Allocation | Allocation | Max | Max | Max | Available | Available | Available | Need | Need | Need | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| A | B | C | A | B | C | A | B | C | A | B | C | |
| P0 | 0 | 1 | 0 | 7 | 5 | 3 | 3 | 3 | 2 | 7 | 4 | 3 |
| P1 | 2 | 0 | 0 | 3 | 2 | 2 | 1 | 2 | 2 | |||
| P2 | 3 | 0 | 2 | 9 | 0 | 2 | 6 | 0 | 0 | |||
| P3 | 2 | 1 | 1 | 2 | 2 | 2 | 0 | 1 | 1 | |||
| P4 | 0 | 0 | 2 | 4 | 3 | 3 | 4 | 3 | 1 |
Bước 1: khởi tạo finish:
finish = [False] * nIteration 1
Bước 2: tìm i thỏa finish = False và need[i] <= available: ta tìm được i = 1 thỏa bởi vì (1, 2, 2) <= (3, 3, 2). Tiến trình sẽ được đưa vào chuỗi tiến trình và sẽ được cấp phát tài nguyên để thực thi.
Bước 3: sau khi tiến trình thực thi thì nó sẽ hoàn trả lại tất cả tài nguyên đã được cấp phát. Do đó, vector available sẽ có giá trị là available + allocation[i]:
available = (3, 3, 2) + (2, 0, 0) = (5, 3, 2)Điền vào bảng trạng thái giá trị mới của available:
| Allocation | Allocation | Allocation | Max | Max | Max | Available | Available | Available | Need | Need | Need | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| A | B | C | A | B | C | A | B | C | A | B | C | |
| P0 | 0 | 1 | 0 | 7 | 5 | 3 | 3 | 3 | 2 | 7 | 4 | 3 |
| P1 | 2 | 0 | 0 | 3 | 2 | 2 | 5 | 3 | 2 | 1 | 2 | 2 |
| P2 | 3 | 0 | 2 | 9 | 0 | 2 | 6 | 0 | 0 | |||
| P3 | 2 | 1 | 1 | 2 | 2 | 2 | 0 | 1 | 1 | |||
| P4 | 0 | 0 | 2 | 4 | 3 | 3 | 4 | 3 | 1 |
Gán finish[1] = True, vector finish trở thành:
finish = [False, True, False, False, False]Iteration 2
Tìm được i = 3 thỏa điều kiện, đưa tiến trình vào chuỗi tiến trình. Sau khi tiến trình này thực thi thì available sẽ có giá trị mới là:
available = (5, 3, 2) + (2, 1, 1) = (7, 4, 3)Bảng trạng thái khi đó sẽ là:
| Allocation | Allocation | Allocation | Max | Max | Max | Available | Available | Available | Need | Need | Need | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| A | B | C | A | B | C | A | B | C | A | B | C | |
| P0 | 0 | 1 | 0 | 7 | 5 | 3 | 3 | 3 | 2 | 7 | 4 | 3 |
| P1 | 2 | 0 | 0 | 3 | 2 | 2 | 5 | 3 | 2 | 1 | 2 | 2 |
| P2 | 3 | 0 | 2 | 9 | 0 | 2 | 7 | 4 | 3 | 6 | 0 | 0 |
| P3 | 2 | 1 | 1 | 2 | 2 | 2 | 0 | 1 | 1 | |||
| P4 | 0 | 0 | 2 | 4 | 3 | 3 | 4 | 3 | 1 |
Gán finish[3] = True, vector finish trở thành:
finish = [False, True, False, True, False]Iteration 3
Tìm được i = 4 thỏa điều kiện, đưa tiến trình vào chuỗi tiến trình. Sau khi tiến trình này thực thi thì available sẽ có giá trị mới là:
available = (7, 4, 3) + (0, 0, 2) = (7, 4, 5)Bảng trạng thái khi đó sẽ là:
| Allocation | Allocation | Allocation | Max | Max | Max | Available | Available | Available | Need | Need | Need | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| A | B | C | A | B | C | A | B | C | A | B | C | |
| P0 | 0 | 1 | 0 | 7 | 5 | 3 | 3 | 3 | 2 | 7 | 4 | 3 |
| P1 | 2 | 0 | 0 | 3 | 2 | 2 | 5 | 3 | 2 | 1 | 2 | 2 |
| P2 | 3 | 0 | 2 | 9 | 0 | 2 | 7 | 4 | 3 | 6 | 0 | 0 |
| P3 | 2 | 1 | 1 | 2 | 2 | 2 | 7 | 4 | 5 | 0 | 1 | 1 |
| P4 | 0 | 0 | 2 | 4 | 3 | 3 | 4 | 3 | 1 |
Gán finish[4] = True, vector finish trở thành:
finish = [False, True, False, True, True]Iteration 4
Tìm được i = 0 thỏa điều kiện, đưa tiến trình vào chuỗi tiến trình. Sau khi tiến trình này thực thi thì available sẽ có giá trị mới là:
available = (7, 4, 5) + (0, 1, 0) = (7, 5, 5)Bảng trạng thái khi đó sẽ là:
| Allocation | Allocation | Allocation | Max | Max | Max | Available | Available | Available | Need | Need | Need | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| A | B | C | A | B | C | A | B | C | A | B | C | |
| P0 | 0 | 1 | 0 | 7 | 5 | 3 | 3 | 3 | 2 | 7 | 4 | 3 |
| P1 | 2 | 0 | 0 | 3 | 2 | 2 | 5 | 3 | 2 | 1 | 2 | 2 |
| P2 | 3 | 0 | 2 | 9 | 0 | 2 | 7 | 4 | 3 | 6 | 0 | 0 |
| P3 | 2 | 1 | 1 | 2 | 2 | 2 | 7 | 4 | 5 | 0 | 1 | 1 |
| P4 | 0 | 0 | 2 | 4 | 3 | 3 | 7 | 5 | 5 | 4 | 3 | 1 |
Gán finish[0] = True, vector finish trở thành:
finish = [True, True, False, True, True]Iteration 5
Tìm được i = 2 thỏa điều kiện, đưa tiến trình vào chuỗi tiến trình. Sau khi tiến trình này thực thi thì available sẽ có giá trị mới là:
available = (7, 5, 5) + (3, 0, 2) = (10, 5, 7)Bảng trạng thái khi đó sẽ là:
| Allocation | Allocation | Allocation | Max | Max | Max | Available | Available | Available | Need | Need | Need | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| A | B | C | A | B | C | A | B | C | A | B | C | |
| P0 | 0 | 1 | 0 | 7 | 5 | 3 | 3 | 3 | 2 | 7 | 4 | 3 |
| P1 | 2 | 0 | 0 | 3 | 2 | 2 | 5 | 3 | 2 | 1 | 2 | 2 |
| P2 | 3 | 0 | 2 | 9 | 0 | 2 | 7 | 4 | 3 | 6 | 0 | 0 |
| P3 | 2 | 1 | 1 | 2 | 2 | 2 | 7 | 4 | 5 | 0 | 1 | 1 |
| P4 | 0 | 0 | 2 | 4 | 3 | 3 | 7 | 5 | 5 | 4 | 3 | 1 |
| 10 | 5 | 7 |
Gán finish[2] = 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 ta kết luận hệ thống đang ở trong trạng thái an toàn với chuỗi an toàn là:
Resources
- Slide deadlock của đại học Bách Khoa.
- L-4.5: Deadlock Avoidance Banker’s Algorithm with Example | With English Subtitles