You are on page 1of 6

4 : Bế tắc (Dealocks)

4.1. Mô hình hoá hiện tượng bế tắc


Xét một hệ thống gồm một số tài nguyên được phân bổ cho các tiến trình song hành. Mỗi tiến
trình khi cần tài nguyên sẽ thực hiện dãy các thao tác.
Để phân bổ tài nguyên cho các tiến trình hệ điều hành sử dụng một bảng ghi tình trạng các tài
nguyên tại mỗi thời điểm. Khi đó mỗi tài nguyên sẽ có một hàng đợi gồm những yêu cầu của các tiến
trình.
Một tập hợp các tiến trình sẽ rơi vào trạng thái bế tắc nếu mỗi tiến trình trong tập đó đợi một sự
kiện chỉ có thể gây nên bởi một tiến trình khác trong tập đó.
Ví dụ: Giả sử P0 và P1 là 2 tiến trình song hành cùng sử dụng 1 tài nguyên r1 và r2 được điều
khiển bởi các đèn hiệu s1 và s2. Tại mỗi thời điểm thì 1 tài nguyên chỉ phục vụ cho một tiến trình, khi
đó có thể xảy ra các tình huống:

Tiến trình (P0) Thời điểm (t) Tiến trình (P1)


Wait(S1) t1 Wait(S2)
Wait(S1) t2 ....
..... t3 ....
Wait(S2) t4 Wait(S1)

Sau thời điểm t3, P0 rơi vào trạng thái chờ tài nguyên r2 (Đang được P1 sử dụng).
Sau thời điểm t4, P1 rơi vào trạng thái chờ tài nguyên r1 (Đang được P0 sử dụng).
Bắt đầu từ đây cả 2 tiến trình P0 và P1 đều chờ vô hạn dẫn đến cả 2 tiến trình này đều rơi vào
trạng thái bế tắc (Dealocks).
Nhận xét: ở ví dụ này nếu P0 diễn ra sớm hơn hay muộn hơn P1 thì bế tắc có thể không xảy ra
như vậy điều kiện xảy ra bế tắc phụ thuộc vào thời điểm và thời gian cụ thể.
4.2. Điều kiện xảy ra bế tắc
Tình trạng bế tắc xảy ra khi và chỉ khi có 4 điều kiện tồn tại trong hệ thống:
+ Có tài nguyên "găng"
+ Có hiện tượng giữ và đợi: Có Một tiến trình giữ một số tài nguyên và đang đợi một số
tài nguyên bổ sung được giữ bởi các tiến trình khác.
+ Không có hệ thống phân phối lại tài nguyên: Việc sử dụng tài nguyên không bị ngắt
giữa chừng.
+ Có hiện tượng chờ đợi vòng tròn.
4.3. Phòng chống bế tắc
Để tránh hiện tượng bế tắc thông thường hệ thống áp dụng 3 mức:
- Phòng ngừa: áp dụng các biện pháp để hệ thống không rơi vào trạng thái bế tắc.
- Dự báo và tránh bế tắc: áp dụng các biện pháp để kiểm tra các tiến trình xem có bị rơi vào
trạng thái bế tắc hay không. Nếu có thì thông báo trước khi bế tắc xảy ra.
- Nhận biết và khắc phục: Tìm cách phát hiện và giải quyết.
4.3.1. Phòng ngừa bế tắc
Để phòng ngừa bế tắc cần đảm bảo sao cho 4 điều kiện gây bế tắc không xảy ra đồng thời:
1 - Loại bỏ tài nguyên "găng" : mô phỏng tài nguyên "găng" bằng các tài nguyên có thể sử dụng
chung.
2 - Loại bỏ yếu tố giữ và đợi: Bằng cách phân phối trước tài nguyên tiến trình chỉ thực hiện khi
mọi tài nguyên mà nó yêu cầu đã được phân phối đủ.
+ Các tiến trình chỉ được phép đòi tài nguyên khi nó không giữ 1 tài nguyên nào cả.
Nếu phải chờ đợi thì tiến trình tạm giải phóng các tài nguyên đang có.
+ Nhược điểm : Làm chậm việc sử dụng tài nguyên
Có thể có tiến trình không bao giờ được cấp phát đủ tài nguyên.
+ Thực hiện việc ngắt tài nguyên
Phương pháp 1: Nếu 1 tiến trình đang giữ một số tài nguyên và đòi một tài nguyên khác nhưng
hệ thống không thể phân bổ ngay cho nó thì mọi tài nguyên hiện có của nó bị ngắt và được bổ sung vào
danh sách các tài nguyên tự do.
Tiến trình sẽ được bắt đầu lại khi nó có đủ các tài nguyên cần thiết.
Phương pháp 2 : Khi một tiến trình đòi hỏi một số tài nguyên hệ thống sẽ xem yêu cầu, nếu có
thì phân bổ cho tiến trình. Nếu không thì kiểm tra xem các tài nguyên mà tiến trình yêu cầu có bị giữ
bởi các tiến trình khác cũng đang đợi tài nguyên bổ sung không. Nếu có thì ngắt các tiến trình này và
lấy lại tài nguyên để phân bổ cho tiến trình đang yêu cầu. Nếu không thì tiến trình phải đợi và trong khi
đợi thì số tài nguyên của nó có thể bị ngắt với điều kiện có tiến trình khác đòi lại. Tiến trình được bắt
đầu lại khi nó nhận được tài nguyên yêu cầu và tái tạo lại các tài nguyên bị ngắt.
3 - Loại bỏ yếu tố chờ đợi vòng : Mỗi tài nguyên r được gán một số thứ tự f(r)
Phương pháp 1: Tiến trình giữ tài nguyên ri chỉ được phép đòi tài nguyên rj khi f(ri)<f(rj)
Phương pháp 2: Tiến trình đang giữ tài nguyên r i muốn đòi tài nguyên rj thì phải giải phóng các
tài nguyên ri thoả mãn điều kiện f(ri) > f(rj).
Nhược điểm của phòng ngừa bế tắc:
+ Làm chậm việc sử dụng tài nguyên
+ Số tiến trình được thực hiện trong một đơn vị thời gian thấp do đó chỉ được áp dụng với các hệ
thống có xác suất xảy ra bế tắc lớn.
4.3.2. Tránh bế tắc
Mỗi lần phân phối lại tài nguyên cho các tiến trình thì kiểm tra xem việc phân phối lại có khả
năng đẩy hệ thống vào tình trạng bế tắc hay không, nếu có thì tìm cách giải quyết trước khi tình trạng
bế tắc xảy ra.
a. Khái niệm dãy tiến trình an toàn (Safe Processes)
Giả sử có một dãy tiến trình song hành P 0 .. Pn-1 và mỗi tiến trình có khai báo số tài nguyên cực
đại mà nó cần sử dụng. Dãy tiến trình được gọi là an toàn nếu như mỗi P i các tài nguyên mà Pi cần có
thể được thoả mãn bởi các tài nguyên đang rỗi và các tài nguyên của các Pj đang giữ với j<i. Hệ ở
trạng thái an toàn (Safe State) tại một thời điểm nào đó nếu các tiến trình song hành tại thời điểm đó
có thể sắp xếp được thành một dãy an toàn.
Ví dụ :
Tiến trình Max Need Current Need
P0 10 5
P1 4 2
P2 9 2
Là một dãy an toàn.
b. Thuật toán chuyển sang trạng thái an toàn (dự kiến phân bổ tài nguyên cho tt theo yêu cầu)
Giả sử hệ có n tiến trình và m kiểu tài nguyên. Các cấu trúc dữ liệu sử dụng trong thuật toán :
- Avaiable: mảng 1 x m thể hiện số tài nguyên có thể dùng trong thuật toán.
Avaiable(j) = K ; K là số tài nguyên kiểu rj có thể sử dụng.
- Max : Mảng n x m thể hiện số tài nguyên cực đại mà mỗi tiến trình yêu cầu.
Max(i,j) = K; Tiến trình Pi chỉ có thể yêu cầu số lượng tài nguyên rj cực đại là K.
- Allocation : Mảng n x m thể hiện số tài nguyên mỗi kiểu hiện đang phân bổ cho các tiến trình
trong hệ.
Allocation(i,j) = K : Tiến trình Pi hiện đang sử dụng K tài nguyên của rj
- Need : Mảng n x m thể hiện số tài nguyên còn cần của mỗi tiến trình
Need(i,j) = K: Tiến trình Pi còn cần K tài nguyên của rj.
Chú ý : Need(i,j) = Max (i,j) - Allocation (i,j)
- Request : Mảng n x m thể hiện yêu cầu tài nguyên của các tiến trình
Request(i,j) = K ; Tiến trình Pi yêu cầu K tài nguyên kiểu rj
Quy ước : Khi viết Request i thể hiện dòng thứ i của mảng (ứng với tiến trình P i(các biến Needi,
Allocationi,...)).
Khi tiến trình Pi đưa ra một yêu cầu tài nguyên hệ thống tiến hành các bước sau:
Step1: If Request i < = Needi then goto Step2
Else Error;
Step2 : If Request i < = Avaiable then goto Step3
Else Pi đợi (Tài nguyên không thể phân bổ);
Step3: Hệ thống dự định phân bổ tài nguyên
Avaiable = Avaiable - Requesti
Allocationi = Allocationi + Requesti
Need i = Needi - Requesti
Step4: Kiểm tra hệ có ở trạng thái an toàn hay không (sử dụng tt ở phần c)
Nếu có phân bổ tài nguyên theo dự tính
Nếu không tiến trình Pi phải đợi cùng với tài nguyên Requesti
c. Thuật toán kiểm tra tính an toàn
Trong thuật toán này sử dụng thêm 2 cấu trúc dữ liệu
- Work : Mảng 1 x m
- Finish : Mảng 1 x m
Step1: Khởi tạo
Work:= Avaiable
Finish[i]: = False; i = 1..n
Step2 : Tìm i sao cho
Finish[i]:= False và Needi <= Work
Nếu không tìm thấy goto Step4;
Step3:
Work : = Work + Allocationi;
Allocationi = Allocationi - Allocationi
Finish[i]: = True
Goto Step2
Step4: Nếu Finish[i]:= True với i thì hệ ở trạng thái an toàn, nếu còn ít nhất 1 tiến trình
không an toàn thì hệ không an toàn.

Ví dụ :
Giả sử có 5 tiến trình P0, P1, P2, P3, P4 và 3 tài nguyên là A, B, C như sau:
Process Allocation Max Avaiable
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

Tiến trình P1 có yêu cầu tài nguyên Request1 = (1,0,2). Hãy sử dụng
các thuật toán để phân bổ tài nguyên cho tiến trình theo yêu cầu và xét
xem hệ có ở trạng thái an toàn hay không?
Giải
n = 5, m = 3
Request1 = (1,0,2)
Ta tính : Needi,j = Max i,j – Allocationi,j

Maxi,j Allocationi,j Needi,j


Pi
A B C A B C 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
Dự kiến phân bổ tài nguyên cho P1
Request1= (1,0,2) ≤ Need1 = (1,2,2) đúng
Request1= (1,0,2) ≤ Avaiable = (3,3,2) đúng
Avaiable = Avaiable – Request1 = (3,3,2) – (1,0,2) = (2,3,0)
Allocaion1 = Allocation1 + Request1 = (2,0,0) + (1,0,2) = (3,0,2)
Need1 = Need1 – Request1 = (1,2,2) – (1,0,2) = (0,2,0)

Process Allocation Need Avaiable


A B C A B C A B C
P0 0 1 0 7 4 3 2 3 0
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 = Avaiable = (2,3,0)


Finishi = False với i = 0..4
i=0
Need0 = (7,4,3) ≤ Work = (2,3,0) sai
Finish0 = False ( Tiến trình P0 chưa an toàn)
i=1
Need1 = (0,2,0) ≤ Work = (2,3,0) đúng
Work = Work + Allocation1 = (2,3,0) + (3,0,2) = (5,3,2)
Allocation1=Allocation1 – Allocation1 = (3,0,2) – (3,0,2)= (0,0,0)
Finish1 = True ( Tiến trình P1 an toàn)
i=2
Need2 = (6,0,0) ≤ Work = (5,3,2) sai
Finish2 = False
i=3
Need3 = (0,1,1) ≤ Work = (5,3,2) đúng
Work = Work + Allocation3 = (5,3,2) + (2,1,1) = (7,4,3)
Allocation3=Allocation3 – Allocation3 = (2,1,1) – (2,1,1)= (0,0,0)
Finish3 = True
i=4
Need4 = (4,3,1) ≤ Work = (7,4,3) đúng
Work = Work + Allocation4 = (7,4,3) + (0,0,2) = (7,4,5)
Allocation4=Allocation4 – Allocation4 = (0,0,2) – (0,0,2)= (0,0,0)
Finish4 = True
i=0
Need0 = (7,4,3) ≤ Work = (7,4,5) đúng
Work = Work + Allocation0 = (7,4,5) + (0,1,0) = (7,5,5)
Allocation0=Allocation0 – Allocation0 = (0,1,0) – (0,1,0)= (0,0,0)
Finish0 = True
i=2
Need2 = (6,0,0) ≤ Work = (7,5,5) đúng
Work = Work + Allocation2 = (7,5,5) + (3,0,2) = (10,5,7)
Allocation2=Allocation2 – Allocation2 = (3,0,2) – (3,0,2)= (0,0,0)
Finish2 = True

Với i = 0..4 mà Finishi = True theo thứ tự <1,3,4,0,2> thì


hệ đã cho an toàn

Process Allocation Need Avaiable


A B C A B C A B C
P1 0 0 0 0 2 0 10 5 7
P3 0 0 0 0 1 1
P4 0 0 0 4 3 1
P0 0 0 0 7 4 3
P2 0 0 0 6 0 0

You might also like