CHƯƠNG 5 BẾ TẮC 5.1 Mô hình hệ thống
5.4.2. Giải thuật Ngân hàng
Giải thuật này có thể được dùng trong hệ thống ngân hàng để đảm bảo ngân hàng không bao giờ cấp phát tiền mặt đang có của nó khi nó không thể thoả mãn các yêu cầu của tất cả khách hàng.
Trong thuật toán Ngân hàng, mỗi tiến trình phải khai báo số lượng thực thể (thực thể) tối đa của mỗi 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ể 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ó được đầy đủ tài nguyên thì phải hoàn trả trong một khoảng thời gian hữu hạn nào đó.
Sau đây là các cấu trúc dữ liệu mã hoá trạng thái của hệ thống cấp phát tài nguyên. Gọi n là số tiến trình trong hệ thống và m là số loại tài nguyên trong hệ thống.
70
Available: vector độ dài m, số lượng tài nguyên sẵn sàng của mỗi loại. Available[ j ] = k loại tài nguyên Rj có k thực thể sẵn sàng.
Max: ma trận n m, số lượng tối đa yêu cầu của mỗi tiến trình.
Max[ i, j ] = k tiến trình Pi yêu cầu tối đa k thực thể của loại tài nguyên Rj.
Allocation: ma trận n m, số lượng tài nguyên của mỗi loại hiện được cấp tới mỗi tiến trình.
Allocation[i, j ] = k Pi đã được cấp phát k thực thể của Rj.
Need: ma trận n m, yêu cầu tài nguyên còn lại của mỗi tiến trình. Need[i, j] = k Pi có thể yêu cầu thêm k thực thể của Rj Nhận xét: Need[i, j ] = Max[i, j ] – Allocation[i, j ]
Giả sử, X và Y là các vector có độ dài n. Ta định nghĩa Y X khi và chỉ khi Y[i] X[i] với mọi i = 1,2,…,n, ví dụ: (0, 3, 2, 1) (1, 7, 3, 2).
Thuật toán tìm một chuỗi an toàn sau xác định trạng thái của hệ thống có an toàn hay không:
1. Gọi Work và Finish là hai vector độ dài là m và n. Khởi tạo Work := Available
Finish[ i ] := false, i = 1,…, n 2. Tìm i thỏa
(a) Finish[ i ] = false
(b) Needi Work (hàng thứ i của Need) Nếu không tồn tại i như vậy, đến bước 4.
3. Work := Work + Allocationi; Finish[ i ] := true; quay về bước 2.
4. Nếu Finish[ i ] = true, i = 1,…, n, thì hệ thống đang ở trạng thái an toàn. Độ phức của thuật toán này là O(m.n2).
Thuật toán cấp phát tài nguyên:
Gọi Requesti (độ dài m) là vector yêu cầu của tiến trình Pi. Requesti [ j ] = k Pi
cần k thực thể của tài nguyên Rj.
1. Nếu Requesti Needi thì đến bước 2. Nếu không, báo lỗi vì tiến trình đã vượt yêu cầu tối đa.
2. Nếu Requesti Available thì qua bước 3. Nếu không, Pi phải chờ vì tài nguyên không còn đủ để cấp phát.
3. Giả định cấp phát tài nguyên đáp ứng yêu cầu của Pi bằng cách cập nhật trạng thái hệ thống như sau:
71
Allocationi := Allocationi + Requesti
Needi := Needi – Requesti
4. Áp dụng giải thuật kiểm tra trạng thái an toàn lên trạng thái trên. Nếu trạng thái là an toàn thì tài nguyên được cấp thực sự cho Pi. Nếu trạng thái là không an toàn thì Pi phải đợi, và phục hồi trạng thái:
Available := Available + Requesti
Allocationi := Allocationi - Requesti
Needi := Needi + Requesti
Ví dụ minh họa thuật toán kiểm tra trạng thái an toàn: cho hệ thống có 5 tiến trình P0
,…, P4, 3 loại tài nguyên: A (có 10 thực thể), B (5 thực thể) và C (7 thực thể), trạng thái cấp phát tài nguyên của hệ thống tại thời điểm T0 là:
Allocation Max Available
A B C A B C A B C P0 0 1 0 7 5 3 3 3 2 P1 2 0 0 3 2 2 P2 3 0 2 9 0 2 P3 2 1 1 2 2 2 P4 0 0 2 4 3 3
Ta tính được ma trận Need như sau:
Need A B C P0 7 4 3 P1 1 2 2 P2 6 0 0 P3 0 1 1 P4 4 3 1
72
Ta tìm được mộtchuỗi an toàn là P1, P3, P4, P2, P0 .
Ví dụ minh họa thuật toán cấp phát tài nguyên: cho hệ thống có trạng thái như ở ví dụ trên, hỏi yêu cầu (1, 0, 2) của P1 có được thỏa mãn không?
Kiểm tra điều kiện Request1 Available: (1, 0, 2) (3, 3, 2) là đúng
Giả sử đáp ứng yêu cầu, kiểm tra trạng thái mới có phải là an toàn hay không. Trạng thái mới của hệ thống là:
Áp dụng thuật toán kiểm tra trạng thái an toàn ta thấy trạng thái mới là an toàn (chuỗi an toàn là P1, P3, P4, P0, P2 ), vậy có thể cấp phát tài nguyên cho P1.