CHƢƠNG 6 TREO MÁY DEADLOCK
6.3 Phũng trỏnh bếtắc
Giải phỏp ngăn ngừa bế tắc trỡnh bày ở trờn tập trung vào việc sử dụng quy tắc hay ràng buộc khi cấp phỏt tài nguyờn để ngăn ngừa điều kiện xẩy ra bế tắc. Việc sử dụng ràng buộc như vậy cú nhược điểm là làm cho việc sử dụng tài nguyờn kộm hiệu quả, giảm hiệu năng của tiến trỡnh. Để giải quyết phần nào nhược điểm này cú thể sử dụng nhúm giải phỏp thứ hai là phũng
trỏnh bế tắc (deadlock avoidance).
Phũng trỏnh bế tắc giống ngăn ngừa bế tắc ở chỗ đều nhằm đảm bảo bế tắc khụng thể xảy ra (thực chất cả hai đều là ngăn ngừa). Tuy nhiờn, phũng trỏnh bế tắc cho phộp
ba điều kiện đầu xẩy ra và chỉ đảm bảo sao cho trạng thỏi bế tắc khụng bao giờ đạt tới. Mỗi yờu cầu cấp tài nguyờn của tiến trỡnh sẽ được xem xột và quyết định tựy theo tỡnh hỡnh cụ thể, thay vỡ tuõn theo một quy tắc chung như trong trường hợp ngăn ngừa.
Để làm được như vậy, hệ điều hành yờu cầu tiến trỡnh cung cấp thụng tin về việc sử dụng tài nguyờn của mỡnh và sử dụng thụng tin này khi cấp phỏt. Dạng thụng tin đơn giản và hiệu quả nhất là số lượng tối đa tài nguyờn tiến trỡnh cần sử dụng.
Dựa trờn thụng tin về số lượng tài nguyờn cần cấp tối đa do tiến trỡnh thụng bỏo, hệ thống cú thể phũng trỏnh bế tắc bằng cỏch sử dụng thuật toỏn người cho vay như sau.
Thuật toỏn ngƣời cho vay (banker’s algorithm)
Thuật toỏn người cho vay được đặt tờn dựa trờn sự tương tự giữa việc quyết định cho vay tiền của ngõn hàng với việc cấp phỏt tài nguyờn trong mỏy tớnh. Người cho vay giỏi là người cho vay được nhiều. Tuy nhiờn, khi cho vay vượt quỏ số tiến thực cú sẽ gặp rủi ro do mỗi người vay khụng thể vay đủ số tiến cần thiết để phục vụ kinh doanh, do vậy khụng thể thu hồi vốn và khụng thể trả nợ dẫn tới cả ngõn hàng và người vay rơi vào bế tắc tương tự tiến trỡnh cạnh tranh về tài nguyờn. Thuật toỏn người cho vay được mụ tả như sau.
Khi tiến trỡnh muốn khởi tạo, tiến trỡnh thụng bỏo dạng tài nguyờn và số lượng tài nguyờn tối đa cho mỗi dạng sẽ yờu cầu. Nếu số lượng yờu cầu khụng vượt quỏ khả năng hệ thống, tiến trỡnh sẽ được khởi tạo. Để trỡnh bày thuật toỏn người cho vay, ta định nghĩa một số khỏi niệm sau:
Trạng thỏi được xỏc định bởi tỡnh trạng sử dụng tài nguyờn hiện thời trong hệ thống.
Trạng thỏi được cho bởi cỏc thụng tin sau:
- Số lượng tối đa tài nguyờn mà tiến trỡnh yờu cầu. Thụng tin này được cho dưới dạng ma trận M[n][m], trong đú n là số lượng tiến trỡnh, m là số lượng tài nguyờn, M[i][j] (0<=i<=n, 0<=j<=m) là số lượng tài nguyờn tối đa dạng j mà tiến trỡnh i yờu cầu.
- Số lượng tài nguyờn cũn lại cho dưới dạng vectơ A[m], trong đú A[j] là số lượng tài nguyờn dạng j cũn lại và cú thể cấp phỏt.
- Lượng tài nguyờn đó cấp cho mỗi tiến trỡnh dưới dạng ma trận D[n][m], trong đú D[i][j] là lượng tài nguyờn dạng j đó cấp cho tiến trỡnh i.
- Lượng tài nguyờn cũn cần cấp dưới dạng ma trận C[n][m] trong đú C[i][j]=M[i][j]-
D[i][j] là lượng tài nguyờn dạng j mà tiến trỡnh i cũn cần cấp.
Trạng thỏi an toàn là trạng thỏi mà từ đú cú ớt nhất một phương ỏn cấp phỏt sao cho bế tắc
khụng xẩy ra. Trạng thỏi khụng an toàn là trạng thỏi khỏc với trạng thỏi an toàn.
Với cỏc khỏi niệm trạng thỏi định nghĩa ở trờn, cỏch phũng trỏnh bế tắc được thực hiện như sau. Khi tiến trỡnh cú yờu cầu cấp tài nguyờn, hệ thống giả sử tài nguyờn được cấp, cập nhật lại trạng thỏi và xỏc định xem trạng thỏi đú cú an toàn khụng. Nếu an toàn, tài nguyờn sẽ được cấp thật. Ngược lại, tiến trỡnh bị phong tỏa và chờ tới khi cú thể cấp phỏt an toàn.
Để minh họa, ta xột vớ dụ sau. Hệ thống cú 3 dạng tài nguyờn X, Y, Z với số lượng ban đầu X=10, Y=5, Z=7. Bốn tiến trỡnh P1, P2, P3, P4 cú yờu cầu tài nguyờn tối đa cho trong bảng M sau:
X Y Z
Yờu cầu tối đa
Xột trạng thỏi của hệ thống với lượng tài
nguyờn đó cấp, cũn lại, cũn cần như sau:
Trạng thỏi này là trạng thỏi an toàn do cú thể tỡm ra cỏch cấp phỏt khụng dẫn đến bế tắc, vớ dụ theo thứ tự P2, P4, P3, P1.
Giả sử hệ thống đang nằm trong trạng thỏi an toàn như trờn và P1 yờu cầu cấp 3 tài nguyờn dạng Y, tức là yờu cầu = (0,3,0). Nếu yờu cầu này được thỏa món, hệ thống sẽ chuyển sang trạng thỏi tiếp theo
P1 7 5 3
P2 3 2 2
P3 9 0 2
1. 2. 3. 4.
Khai bỏo mảng W kớch thước m và mảng F kớch thước n. (F[i] chứa tỡnh trạng tiến trỡnh thứ i đó kết thỳc hay chưa, W chứa lượng tài nguyờn cũn lại)
Khởi tạo W=A và F[i]=false (i=0,…,n-1) Tỡm i sao cho:
F[i] = false và C[i][j] W[j] với mọi j=0,…,m-1 Nếu khụng cú i như vậy thỡ chuyển sang bước 4 a) W = W + D[i]
b) F[i] = true c) Quay lại bước 2
If F[i] = true với mọi i =0,…,n-1 thỡ trạng thỏi an toàn Else trạng thỏi khụng an toàn
Đõy là trạng thỏi khụng an toàn vỡ khụng thể tỡm ra cỏch cấp phỏt nào cho phộp bất kỳ tiến trỡnh nào thực hiện đến cựng trước khi cú thể trả lại tài nguyờn. Do vậy yờu cầu (0,3,0) phải bị từ chối.
Việc kiểm tra xem một trạng thỏi cú phải là trạng thỏi an toàn khụng cú thể thực hiện bằng thuật toỏn thể hiện trờn 2.21.
6.1 Phỏt hiện bế tắc và xử lý
Cỏc biện phỏp ngăn ngừa và phũng trỏnh bế tắc sử dụng ràng buộc khi cấp phỏt tài nguyờn để trỏnh cho bế tắc khụng xảy ra. Đặc điểm chung của hai nhúm giải phỏp này là an toàn nhưng đều ảnh hưởng tới hiệu quả sử dụng tài nguyờn.
Phỏt hiện bế tắc (deadlock detection) là cỏch tiếp cận khỏc. Hệ thống khụng thực hiện biện
phỏp ngăn ngừa hay phũng trỏnh và do vậy bế tắc cú thể xảy ra. Hệ thống định kỳ kiểm tra để phỏt hiện cú tỡnh trạng bế tắc hay khụng, nếu cú, hệ thống sẽ xử lý để khụi phục lại trạng thỏi khụng cú bế tắc. Tiếp theo đõy, ta sẽ xem xột hai nội dung: cỏch phỏt hiện bế tắc và cỏch khụi phục lại trạng thỏi khụng bế tắc.
Phỏt hiện bế tắc
Trường hợp mỗi dạng tài nguyờn chỉ cú một tài nguyờn duy nhất. Trong trường hợp này, việc
phỏt hiện bế tắc được thực hiện tương đối đơn giản bằng cỏch sử dụng đồ thị biểu diễn quan hệ chờ đợi lần nhau giữa tiến trỡnh (tạm gọi là đồ thị chờ đợi), được xõy dựng như sau.
Trước hết, ta xõy dựng đồ thị cấp phỏt tài nguyờn như thể hiện trờn hỡnh 6.1.a, trong đú cỏc nỳt là tiến trỡnh và tài nguyờn. Tài nguyờn được nối với tiến trỡnh bằng cung cú hướng nếu tài nguyờn được cấp cho tiến trỡnh đú. Tiến trỡnh được nối với tài nguyờn bằng cung cú hướng nếu tiến trỡnh đang được cấp tài nguyờn đú.
Đồ thị chờ đợi được xõy dựng từ đồ thị cấp phỏt tài nguyờn bằng cỏch bỏ đi cỏc nỳt tương ứng với tài nguyờn và nhập cỏc cung đi qua nỳt bị bỏ. Hỡnh 6.1.b minh họa cho việc xõy dựng đồ thị chờ đợi từ đồ thị cấp phỏt tài nguyờn bờn trỏi.
Đồ thị chờ đợi cho phộp phỏt hiện tỡnh trạng tiến trỡnh chờ đợi vũng trũn là điều kiện đủ để sinh ra bế tắc. Trong vớ dụ vừa xột, ta cú thể thấy tiến trỡnh P1, P2, P4 đang bị bế tắc do phải chờ đợi vũng trũn lẫn nhau. Trong trường hợp tổng quỏt, để phỏt hiện bế tắc trờn đồ thị chờ đợi cú thể sử dụng thuật toỏn phỏt hiện chu trỡnh trờn đồ thị cú hướng.
Thời điểm phỏt hiện bế tắc
Trong phần trờn ta đó xem xột thuật toỏn phỏt hiện bế tắc. Vấn đề tiếp theo là khi nào hệ thống cần sử dụng những thuật toỏn này để phỏt hiện bế tắc (nếu cú). Chu kỳ chạy thuật toỏn phỏt hiện bế tắc sẽ phụ thuộc vào hệ thống cụ thể và tần suất xuất hiện bế tắc trờn đú. Tuy nhiờn việc xỏc định chu kỳ chạy thuật toỏn cú thể dựa trờn những phõn tớch sau.
Bế tắc chỉ cú thể xuất hiện sau khi một tiến trỡnh nào đú yờu cầu tài nguyờn và khụng được thỏa món. Lưu ý là khụng phải yờu cầu khụng được thỏa món nào cũng làm phỏt sinh bế tắc. Như vậy, hệ thống cú thể chạy thuật toỏn phỏt hiện bế tắc mỗi khi cú yờu cầu cấp phỏt tài nguyờn khụng được thỏa món. Chu kỳ phỏt hiện bế tắc như vậy cho phộp phỏt hiện bế tắc ngay khi vừa xẩy ra. Tuy nhiờn, do thuật toỏn phỏt hiện bế tắc cú độ phức tạp nhất định nờn việc chạy thường xuyờn như vậy làm giảm hiệu năng hệ thống.
Để trỏnh ảnh hưởng đến hiệu năng, cú thể giảm tần suất chạy thuật toỏn phỏt hiện bế tắc, chẳng hạn sau từng chu kỳ từ vài chục phỳt tới vài giờ. Ngoài ra cú thể chạy thuật toỏn khi cú một số dấu hiệu như hiệu suất sử dụng CPU giảm xuống dưới một ngưỡng nào đú. Việc giảm hiệu suất sử dụng CPU cú thể cú nguyờn nhõn là tiến trỡnh bị bế tắc khụng thể thực hiện tiếp và do vậy khụng sử dụng CPU.
Xử lý khi bị bế tắc
Khi phỏt hiện bế tắc, hệ điều hành cần cú biện phỏp xử lý để khụi phục lại hệ
thống về tỡnh trạng khụng bế tắc. Nhỡn chung, hệ điều hành cú thể sử dụng một
trong những phương phỏp sau để xử lý khi phỏt hiện bế tắc:
- Kết thỳc tất cả tiến trỡnh đang bị bế tắc. Đõy là cỏch giải quyết đơn giản nhất và cho phộp chấm dứt ngay bế tắc. Nhược điểm của phương phỏp này là bỏ phớ phần việc tiến trỡnh đó thực hiện trước khi bế tắc.
- Kết thỳc lần lượt từng tiến trỡnh đang bị bế tắc cho đến khi hết bế tắc. Hệ điều hành sẽ phải chạy lại thuật toỏn phỏt hiện bế tắc sau khi kết thỳc mỗi tiến trỡnh. Hệ điều hành cú thể chọn thứ tự kết thỳc tiến trỡnh dựa trờn tiờu chớ nào đú, chẳng hạn tiến trỡnh đang giữ nhiều tài nguyờn hơn sẽ bị chọn kết thỳc trước.
- Khụi phục tiến trỡnh về thời điểm trước khi bị bế tắc sau đú cho cỏc tiến trỡnh thực hiện lại từ điểm này. Phương phỏp này đũi hỏi hệ điều hành lưu trữ trạng thỏi để cú thể thực hiện quay lui và khụi phục về cỏc điểm kiểm tra trước đú. Ngoài ra, khi chạy lại từ những điểm chưa bế tắc, cỏc tiến trỡnh cú thể lại rơi vào bế tắc tiếp.
- Lần lượt thu hồi lại tài nguyờn từ cỏc tiến trỡnh bế tắc cho tới khi hết bế tắc. Tiến trỡnh bị thu hồi tài nguyờn được khụi phục về trạng thỏi trước khi được cấp tài nguyờn.