Deadlock & Điều kiện cần để xảy ra deadlock
Trang 1 trong tổng số 1 trang
Deadlock & Điều kiện cần để xảy ra deadlock
Những điều kiện cần thiết gây ra deadlock
Trường hợp deadlock có thể phát sinh nếu bốn điều kiện sau xảy ra cùng một
lúc trong hệ thống:
1) Loại trừ hỗ tương: ít nhất một tài nguyên phải được giữ trong chế độ
không chia sẻ; nghĩa là, chỉ một quá trình tại cùng một thời điểm có thể sử
dụng tài nguyên. Nếu một quá trình khác yêu cầu tài nguyên đó, quá trình
yêu cầu phải tạm dừng cho đến khi tài nguyên được giải phóng.
2) Giữ và chờ cấp thêm tài nguyên: quá trình phải đang giữ ít nhất một tài
nguyên và đang chờ để nhận tài nguyên thêm mà hiện đang được giữ bởi
quá trình khác.
3) Không đòi lại tài nguyên từ quá trình đang giữ chúng: Các tài nguyên
không thể bị đòi lại; nghĩa là, tài nguyên có thể được giải phóng chỉ tự ý
bởi quá trình đang giữ nó, sau khi quá trình đó hoàn thành tác vụ.
4) Tồn tại chu trình trong đồ thị cấp phát tài nguyên: một tập hợp các quá
trình {P0, P1,…,Pn} đang chờ mà trong đó P0 đang chờ một tài nguyên
được giữ bởi P1, P1 đang chờ tài nguyên đang giữ bởi P2,…,Pn-1 đang chờ
tài nguyên đang được giữ bởi quá trình P0.
Chúng ta nhấn mạnh rằng tất cả bốn điều kiện phải cùng phát sinh để deadlock
xảy ra. Điều kiện chờ đợi ch trình đưa đến điều kiện giữ-và-chờ vì thế bốn điều kiện
không hoàn toàn độc lập.
IV.2 Đồ thị cấp phát tài nguyên
Deadlock có thể mô tả chính xác hơn bằng cách hiển thị đồ thị có hướng gọi là
đồ thị cấp phát tài nguyên hệ thống. Đồ thị này chứa một tập các đỉnh V và tập hợp
các cạnh E. Một tập các đỉnh V được chia làm hai loại nút P = {P1, P2,…,Pn} là tập
hợp các quá trình hoạt động trong hệ thống, và R = {R1, R2, ..., Rm} là tập hợp chứa
tất cả các loại tài nguyên trong hệ thống.
Một cạnh có hướng từ quá trình Pi
tới loại tài nguyên Rj được ký hiệu Pi →Rj
;
nó biểu thị rằng quá trình Pi đã yêu cầu loại tài nguyên Rj
và hiện đang chờ loại tài
nguyên đó. Một cạnh có hướng từ loại tài nguyên Rj
tới quá trình Pi được hiển thị bởi
Rj → Pi
; nó hiển thị rằng thể hiện của loại tài nguyên Rj đã được cấp phát tới quá trình
Pi
. Một cạnh có hướng Pi → Rj được gọi là cạnh yêu cầu; một cạnh có hướng Rj → Pi
được gọi là cạnh gán.
Bằng hình tượng, chúng ta hiển thị mỗi quá trình Pi
là một hình tròn, và mỗi
loại tài nguyên Rj
là hình chữ nhật. Vì loại tài nguyên Rj
có thể có nhiều hơn một thể
hiện, chúng ta hiển thị mỗi thể hiện là một chấm nằm trong hình vuông. Chú ý rằng
một cạnh yêu cầu trỏ tới chỉ một hình vuông Rj
, trái lại một cạnh gán cũng phải gán
tới một trong các dấu chấm trong hình vuông.
Khi quá trình Pi
yêu cầu một thể hiện của loại tài nguyên Rj
, một cạnh yêu cầu
được chèn vào đồ thị cấp phát tài nguyên. Khi yêu cầu này có thể được đáp ứng, cạnh
yêu cầu lập tức được truyền tới cạnh gán. Khi quá trình không còn cần truy xuất tới
tài nguyên, nó giải phóng tài nguyên, và khi đó dẫn đến cạnh gán bị xoá.
Đồ thị cấp phát tài nguyên được hiển thị trong hình VI-1 dưới đây mô tả trường hợp
sau:
Hình 0-1 Đồ thị cấp phát tài nguyên
• Các tập P, R, và E:
o P = {P1, P2, P3}
o R = {R1, R2, R3, R4}
o E = {P1→R1, P2 →R3, R1 →P2, R2→P2, R3→P3}
• Các thể hiện tài nguyên
o Một thể hiện của tài nguyên loại R1
o Hai thể hiện của tài nguyên loại R2
o Một thể hiện của tài nguyên loại R3
o Một thể hiện của tài nguyên loại R4
• Trạng thái quá trình
o Quá trình P1 đang giữ một thể hiện của loại tài nguyên R2 và đang chờ
một thể hiện của loại tài nguyên R1.
o Quá trình P2 đang giữ một thể hiện của loại tài nguyên R1 và R2 và
đang chờ một thể hiện của loại tài nguyên R3.
o Quá trình P3 đang giữ một thể hiện của R3
Đồ thị cấp phát tài nguyên hiển thị rằng, nếu đồ thị không chứa chu trình, thì
không có quá trình nào trong hệ thống bị deadlock. Nếu đồ thị có chứa chu trình, thì
deadlock có thể tồn tại.
Nếu mỗi loại tài nguyên có chính xác một thể hiện, thì một chu trình ngụ ý rằng
một deadlock xảy ra. Nếu một chu trình bao gồm chỉ một tập hợp các loại tài nguyên,
mỗi loại tài nguyên chỉ có một thể hiện thì deadlock xảy ra. Mỗi quá trình chứa trong
chu trình bị deadlock. Trong trường hợp này, một chu trình trong đồ thị là điều kiện
cần và đủ để tồn tại deadlock.
Nếu mỗi loại tài nguyên có nhiều thể hiện thì chu trình không ngụ ý deadlock
xảy. Trong trường hợp này, một chu trình trong đồ thị là điều kiện cần nhưng chưa đủ
để tồn tại deadlock.
Để hiển thị khái niệm này, chúng ta xem lại đồ thị ở hình VII-1 ở trên. Giả sử
quá trình P3 yêu cầu một thể hiện của loại tài nguyên R2. Vì không có thể hiện tài
nguyên hiện có, một cạnh yêu cầu P3 → R2 được thêm vào đồ thị (hình VI-2). Tại thời
điểm này, hai chu trình nhỏ tồn tại trong hệ thống:
P1 → R1 → P2 → R3 → P3 → R2 → P1
P2 → R3 → P3 → R2 → P2
Hình 0-2 Đồ thị cấp phát tài nguyên với deadlock
Quá trình P1, P2, và P3 bị deadlock. Quá trình P3 đang chờ tài nguyên R3, hiện
được giữ bởi quá trình P2. Hay nói cách khác, quá trình P3 đang chờ quá trình P1 hay
P2 giải phóng tài nguyên R2. Ngoài ra, quá trình P1 đang chờ quá trình P2 giải phóng
tài nguyên R1.
Bây giờ xem xét đồ thị cấp phát tài nguyên trong hình VI-3 dưới đây. Trong thí
dụ này, chúng ta cũng có một chu kỳ
P1 → R1 → P3 → R2 → P1
Hình 0-3 Đồ thị cấp phát tài nguyên có chu trình nhưng không bị deadlock
Tuy nhiên, không có deadlock. Chú ý rằng quá trình P4 có thể giải phóng thể
hiện của loại tài nguyên R2. Tài nguyên đó có thể được cấp phát tới P3 sau đó, chu
trình sẽ không còn.
Tóm lại, nếu đồ thị cấp phát tài nguyên không có chu trình thì hệ thống không
có trạng thái deadlock. Ngoài ra, nếu có chu trình thì có thể có hoặc không trạng thái
deadlock. Nhận xét này là quan trọng khi chúng ta giải quyết vấn đề deadlock.
V Các phương pháp xử lý deadlock
Phần lớn, chúng ta có thể giải quyết vấn đề deadlock theo một trong ba cách:
• Chúng ta có thể sử dụng một giao thức để ngăn chặn hay tránh deadlocks, đảm
bảo rằng hệ thống sẽ không bao giờ đi vào trạng thái deadlock
• Chúng ta có thể cho phép hệ thống đi vào trạng thái deadlock, phát hiện nó và
phục hồi.
• Chúng ta có thể bỏ qua hoàn toàn vấn đề này và giả vờ deadlock không bao
giờ xảy ra trong hệ thống. Giải pháp này được dùng trong nhiều hệ điều hành,
kể cả UNIX.
• Chúng ta sẽ tìm hiểu vắn tắt mỗi phương pháp. Sau đó, chúng ta sẽ trình bày
các giải thuật một cách chi tiết trong các phần sau đây.
Để đảm bảo deadlock không bao giờ xảy ra, hệ thống có thể dùng kế hoạch
ngăn chặn hay tránh deadlock. Ngăn chặn deadlock là một tập hợp các phương pháp
để đảm bảo rằng ít nhất một điều kiện cần (trong phần VI.4.1) không thể xảy ra. Các
phương pháp này ngăn chặn deadlocks bằng cách ràng buộc yêu cầu về tài nguyên
được thực hiện như thế nào. Chúng ta thảo luận phương pháp này trong phần sau.
Ngược lại, tránh deadlock yêu cầu hệ điều hành cung cấp những thông tin bổ
sung tập trung vào loại tài nguyên nào một quá trình sẽ yêu cầu và sử dụng trong thời
gian sống của nó. Với những kiến thức bổ sung này, chúng ta có thể quyết định đối
với mỗi yêu cầu quá trình nên chờ hay không. Để quyết định yêu cầu hiện tại có thể
được thoả mãn hay phải bị trì hoãn, hệ thống phải xem xét tài nguyên hiện có, tài
nguyên hiện cấp phát cho mỗi quá trình, và các yêu cầu và giải phóng tương lai của
mỗi quá trình.
Nếu một hệ thống không dùng giải thuật ngăn chặn hay tránh deadlock thì
trường hợp deadlock có thể xảy ra. Trong môi trường này, hệ thống có thể cung cấp
một giải thuật để xem xét trạng thái của hệ thống để xác định deadlock có xảy ra hay
không và giải thuật phục hồi từ deadlock.
Nếu hệ thống không đảm bảo rằng deadlock sẽ không bao giờ xảy ra và cũng
không cung cấp một cơ chế để phát hiện và phục hồi deadlock thì có thể dẫn đến
trường hợp hệ thống ở trong trạng thái deadlock. Trong trường hợp này, deadlock
không được phát hiện sẽ làm giảm năng lực hệ thống vì tài nguyên đang được giữ bởi
những quá trình mà chúng không thể thực thi, đi vào trạng thái deadlock. Cuối cùng,
hệ thống sẽ dừng các chức năng và cần được khởi động lại bằng thủ công.
Mặc dù phương pháp này dường như không là tiếp cận khả thi đối với vấn đề
deadlock nhưng nó được dùng trong một số hệ điều hành. Trong nhiều hệ thống,
deadlock xảy ra không thường xuyên; do đó phương pháp này là rẻ hơn chi phí cho
phương pháp ngăn chặn deadlock, tránh deadlock, hay phát hiện và phục hồi deadlock
mà chúng phải được sử dụng liên tục. Trong một số trường hợp, hệ thống ở trong
trạng thái cô đặc nhưng không ở trạng thái deadlock. Như thí dụ, xem xét một quá
trình thời thực chạy tại độ ưu tiên cao nhất (hay bất cứ quá trình đang chạy trên bộ
định thời biểu không trưng dụng) và không bao giờ trả về điều khiển đối với hệ điều
hành. Do đó, hệ thống phải có phương pháp phục hồi bằng thủ công cho các điều
kiện không deadlock và có thể đơn giản sử dụng các kỹ thuật đó cho việc phục hồi
deadlock.
VI Ngăn chặn deadlock
Để deadlock xảy ra, một trong bốn điều kiện cần phải xảy ra. Bằng cách đảm
bảo ít nhất một trong bốn điều kiện này không thể xảy ra, chúng ta có thể ngăn chặn
việc xảy ra của deadlock. Chúng ta tìm hiểu tỷ mỹ tiếp cận này bằng cách xem xét
mỗi điều kiện cần riêng rẻ nhau.
VI.1 Loại trừ hỗ tương
Điều kiện loại trừ hỗ tương phải giữ cho tài nguyên không chia sẻ. Thí dụ, một
máy in không thể được chia sẻ cùng lúc bởi nhiều quá trình. Ngược lại, các tài nguyên
có thể chia sẻ không đòi hỏi truy xuất loại trừ hỗ tương và do đó không thể liên quan
đến deadlock. Những tập tin chỉ đọc là một thí dụ tốt cho tài nguyên có thể chia sẻ.
Nếu nhiều quá trình cố gắng mở một tập tin chỉ đọc tại cùng một thời điểm thì chúng
có thể được gán truy xuất cùng lúc tập tin. Một quá trình không bao giờ yêu cầu chờ
tài nguyên có thể chia sẻ. Tuy nhiên, thường chúng ta không thể ngăn chặn deadlock
bằng cách từ chối điều kiện loại trừ hỗ tương: một số tài nguyên về thực chất không
thể chia sẻ.
VI.2 Giữ và chờ cấp thêm tài nguyên
Để đảm bảo điều kiện giữ-và-chờ cấp thêm tài nguyên không bao giờ xảy ra
trong hệ thống, chúng ta phải đảm bảo rằng bất cứ khi nào một quá trình yêu cầu tài
nguyên, nó không giữ bất cứ tài nguyên nào khác. Một giao thức có thể được dùng là
đòi hỏi mỗi quá trình yêu cầu và được cấp phát tất cả tài nguyên trước khi nó bắt đầu
thực thi. Chúng ta có thể cài đặt sự cung cấp này bằng cách yêu cầu các lời gọi hệ
thống yêu cầu tài nguyên cho một quá trình trước tất cả các lời gọi hệ thống khác.
Một giao thức khác cho phép một quá trình yêu cầu tài nguyên chỉ khi quá trình
này không có tài nguyên nào. Một quá trình có thể yêu cầu một số tài nguyên và dùng
chúng. Tuy nhiên, trước khi nó có thể yêu cầu bất kỳ tài nguyên bổ sung nào, nó phải
giải phóng tất cả tài nguyên mà nó hiện đang được cấp phát.
Để hiển thị sự khác nhau giữa hai giao thức, chúng ta xét một quá trình chép dữ
liệu từ băng từ tới tập tin đĩa, sắp xếp tập tin đĩa và sau đó in kết quả ra máy in. Nếu
tất cả tài nguyên phải được yêu cầu cùng một lúc thì khởi đầu quá trình phải yêu cầu
băng từ, tập tin đĩa và máy in. Nó sẽ giữ máy in trong toàn thời gian thực thi của nó
mặc dù nó cần máy in chỉ ở giai đoạn cuối.
Phương pháp thứ hai cho phép quá trình yêu cầu ban đầu chỉ băng từ và tập tin
đĩa. Nó chép dữ liệu từ băng từ tới đĩa, rồi giải phóng cả hai băng từ và đĩa. Sau đó,
quá trình phải yêu cầu lại tập tin đĩa và máy in. Sau đó, chép tập tin đĩa tới máy in, nó
giải phóng hai tài nguyên này và kết thúc.
Hai giao thức này có hai nhược điểm chủ yếu. Thứ nhất, việc sử dụng tài
nguyên có thể chậm vì nhiều tài nguyên có thể được cấp nhưng không được sử dụng
trong thời gian dài. Trong thí dụ được cho, chúng ta có thể giải phóng băng từ và tập
tin đĩa, sau đó yêu cầu lại tập tin đĩa và máy in chỉ nếu chúng ta đảm bảo rằng dữ liệu
của chúng ta sẽ vẫn còn trên tập tin đĩa. Nếu chúng ta không thể đảm bảo rằng dữ liệu
vẫn còn tập tin đĩa thì chúng ta phải yêu cầu tất cả tài nguyên tại thời điểm bắt đầu
cho cả hai giao thức. Thứ hai, đói tài nguyên là có thể. Một quá trình cần nhiều tài
nguyên phổ biến có thể phải đợi vô hạn định vì một tài nguyên mà nó cần luôn được
cấp phát cho quá trình khác.
VI.3 Không đòi lại tài nguyên từ quá trình đang giữ chúng
Điều kiện cần thứ ba là không đòi lại những tài nguyên đã được cấp phát rồi. Để
đảm bảo điều kiện này không xảy ra, chúng ta có thể dùng giao thức sau. Nếu một quá
trình đang giữ một số tài nguyên và yêu cầu tài nguyên khác mà không được cấp phát
tức thì tới nó (nghĩa là, quá trình phải chờ) thì tất cả tài nguyên hiện đang giữ được
đòi lại. Nói cách khác, những tài nguyên này được giải phóng hoàn toàn. Những tài
nguyên bị đòi lại được thêm tới danh sách các tài nguyên mà quá trình đang chờ. Quá
trình sẽ được khởi động lại chỉ khi nó có thể nhận lại tài nguyên cũ của nó cũng như
các tài nguyên mới mà nó đang yêu cầu.
Có một sự chọn lựa khác, nếu một quá trình yêu cầu một số tài nguyên, đầu tiên
chúng ta kiểm tra chúng có sẳn không. Nếu tài nguyên có sẳn, chúng ta cấp phát
chúng. Nếu tài nguyên không có sẳn, chúng ta kiểm tra chúng có được cấp phát tới
một số quá trình khác đang chờ tài nguyên bổ sung. Nếu đúng như thế, chúng ta lấy
lại tài nguyên mong muốn đó từ quá trình đang đợi và cấp chúng cho quá trình đang
yêu cầu. Nếu tài nguyên không sẳn có hay được giữ bởi một quá trình đang đợi, quá
trình đang yêu cầu phải chờ. Trong khi nó đang chờ, một số tài nguyên của nó có thể
được đòi lại chỉ nếu quá trình khác yêu cầu chúng. Một quá trình có thể được khởi
động lại chỉ khi nó được cấp các tài nguyên mới mà nó đang yêu cầu và phục hồi bất
cứ tài nguyên nào đã bị lấy lại trong khi nó đang chờ.
Giao thức này thường được áp dụng tới tài nguyên mà trạng thái của nó có thể
được lưu lại dễ dàng và phục hồi lại sau đó, như các thanh ghi CPU và không gian bộ
nhớ. Nó thường không thể được áp dụng cho các tài nguyên như máy in và băng từ.
VI.4 Tồn tại chu trình trong đồ thị cấp phát tài nguyên
Điều kiện thứ tư và cũng là điều kiện cuối cùng cho deadlock là điều kiện tồn
tại chu trình trong đồ thị cấp phát tài nguyên. Một cách để đảm bảo rằng điều kiện này
không bao giờ xảy ra là áp đặt toàn bộ thứ tự của tất cả loại tài nguyên và đòi hỏi mỗi
quá trình trong thứ tự tăng của số lượng.
Gọi R = {R1, R2, …, Rm} là tập hợp loại tài nguyên. Chúng ta gán mỗi loại tài
nguyên một số nguyên duy nhất, cho phép chúng ta so sánh hai tài nguyên và xác định
tài nguyên này có đứng trước tài nguyên khác hay không trong thứ tự của chúng ta.
Thông thường, chúng ta định nghĩa hàm ánh xạ một-một F: R → N, ở đây N là tập
hợp các số tự nhiên. Thí dụ, nếu tập hợp các loại tài nguyên R gồm các ổ băng từ, ổ
đĩa và máy in thì hàm F có thể được định nghĩa như sau:
F(ổ băng từ) = 1,
F(đĩa từ) = 5,
F(máy in) = 12.
Bây giờ chúng ta xem giao thức sau để ngăn chặn deadlock: mỗi quá trình có
thể yêu cầu tài nguyên chỉ trong thứ tự tăng của số lượng. Nghĩa là, một quá trình ban
đầu có thể yêu cầu bất cứ số lượng thể hiện của một loại tài nguyên Ri
. Sau đó, một
quá trình có thể yêu cầu các thể hiện của loại tài nguyên Rj
nếu và chỉ nếu F(Rj
) >
F(Ri
). Nếu một số thể hiện của cùng loại tài nguyên được yêu cầu, thì một yêu cầu
cho tất cả thể hiện phải được cấp phát. Thí dụ, sử dụng hàm được định nghĩa trước đó,
một quá trình muốn dùng ổ băng từ và máy in tại cùng một lúc trước tiên phải yêu cầu
ổ băng từ và sau đó yêu cầu máy in.
Nói một cách khác, chúng ta yêu cầu rằng, bất cứ khi nào một quá trình yêu cầu
một thể hiện của loại tài nguyên Rj
, nó giải phóng bất cứ tài nguyên Ri
sao cho F(Ri
) ≥
F(Rj
).
Nếu có hai giao thức được dùng thì điều kiện tồn tại chu trình không thể xảy ra.
Chúng ta có thể giải thích điều này bằng cách cho rằng tồn tại chu trình trong đồ thị
cấp phát tài nguyên tồn tại. Gọi tập hợp các quá trình chứa tồn tại chu trình trong đồ
thị cấp phát tài nguyên là {P0, P1, … , Pn}, ở đây Pi đang chờ một tài nguyên Ri
, mà Ri
được giữ bởi quá trình Pi+1. Vì sau đó quá trình Pi+1 đang giữ tài nguyên Ri
trong khi
yêu cầu tài nguyên Ri+1, nên chúng ta có F(Ri
) < F(Ri+1) cho tất cả i. Nhưng điều kiện
này có nghĩa là F(R0) < F(R1) < …< F(Rn) < F(R0). Bằng qui tắc bắt cầu F(R0) <
F(R0), điều này là không thể. Do đó, không thể có chờ chu trình.
Chú ý rằng hàm F nên được định nghĩa dựa theo thứ tự tự nhiên của việc sử
dụng tài nguyên trong hệ thống. Thí dụ, vì ổ băng từ thường được yêu cầu trước máy
in nên có thể hợp lý để định nghĩa F( ổ băng từ) < F(máy in).
VIITránh deadlock
Các giải thuật ngăn chặn deadlock, được thảo luận ở VII-6, ngăn chặn deadlock
bằng cách hạn chế cách các yêu cầu có thể được thực hiện. Các ngăn chặn đảm bảo
rằng ít nhất một trong những điều kiện cần cho deadlock không thể xảy ra. Do đó,
deadlock không thể xảy ra. Tuy nhiên, các tác dụng phụ có thể ngăn chặn deadlock
bởi phương pháp này là việc sử dụng thiết bị chậm và thông lượng hệ thống bị giảm.
Một phương pháp khác để tránh deadlock là yêu cầu thông tin bổ sung về cách
tài nguyên được yêu cầu. Thí dụ, trong một hệ thống với một ổ băng từ và một máy
in, chúng ta có thể bảo rằng quá trình P sẽ yêu cầu ổ băng từ trước và sau đó máy in
trước khi giải phóng cả hai tài nguyên. Trái lại, quá trình Q sẽ yêu cầu máy in trước
và sau đó ổ băng từ. Với kiến thức về thứ tự hoàn thành của yêu cầu và giải phóng
cho mỗi quá trình, chúng ta có thể quyết định cho mỗi yêu cầu của quá trình sẽ chờ
hay không. Mỗi yêu cầu đòi hỏi hệ thống xem tài nguyên hiện có, tài nguyên hiện
được cấp tới mỗi quá trình, và các yêu cầu và giải phóng tương lai của mỗi quá trình,
để yêu cầu của quá trình hiện tại có thể được thoả mãn hay phải chờ để tránh khả năng
xảy ra deadlock.
Các giải thuật khác nhau có sự khác nhau về lượng và loại thông tin được yêu
cầu. Mô hình đơn giản và hữu ích nhất yêu cầu mỗi quá trình khai báo số lớn nhất tài
nguyên của mỗi loại mà nó cần. Thông tin trước về số lượng tối đa tài nguyên của mỗi
loại được yêu cầu cho mỗi quá trình, có thể xây dựng một giải thuật đảm bảo hệ thống
sẽ không bao giờ đi vào trạng thái deadlock. Đây là giải thuật định nghĩa tiếp cận
tránh deadlock. Giải thuật tránh deadlock tự xem xét trạng thái cấp phát tài nguyên để
đảm bảo điều kiện tồn tại chu trình trong đồ thị cấp phát tài nguyên có thể không bao
giờ xảy ra. Trạng thái cấp phát tài nguyên được định nghĩa bởi số tài nguyên sẳn dùng
và tài nguyên được cấp phát và số yêu cầu tối đa của các quá trình.
VII.1 Trạng thái an toàn
Một trạng thái là an toàn nếu hệ thống có thể cấp phát các tài nguyên tới mỗi
quá trình trong một vài thứ tự và vẫn tránh deadlock. Hay nói cách khác, một hệ thống
ở trong trạng thái an toàn chỉ nếu ở đó tồn tại một thứ tự an toàn. Thứ tự của các quá
trình <P1, P2, …, Pn> là một thứ tự an toàn cho trạng thái cấp phát hiện hành nếu đối với mỗi thứ tự Pi
, các tài nguyên mà Pi
yêu cầu vẫn có thể được thoả mãn bởi tài
nguyên hiện có cộng với các tài nguyên được giữ bởi tất cả Pj
, với j<i. Trong trường
hợp này, nếu những tài nguyên mà quá trình Pi
yêu cầu không sẳn dùng tức thì thì Pi
có thể chờ cho đến khi tất cả Pj
hoàn thành. Khi chúng hoàn thành, Pi
có thể đạt được
tất cả những tài nguyên nó cần, hoàn thành các tác vụ được gán, trả về những tài
nguyên được cấp phát cho nó và kết thúc. Khi Pi
kết thúc, Pi+1 có thể đạt được các tài
nguyên nó cần,... Nếu không có thứ tự như thế tồn tại thì trạng thái hệ thống là không
an toàn.
Một trạng thái an toàn không là trạng thái deadlock. Do đó, trạng thái
deadlock là trạng thái không an toàn. Tuy nhiên, không phải tất cả trạng thái không an
toàn là deadlock (hình VI-4). Một trạng thái không an toàn có thể dẫn đến deadlock.
Với điều kiện trạng thái là an toàn, hệ điều hành có thể tránh trạng thái không an toàn
(và deadlock). Trong một trạng thái không an toàn, hệ điều hành có thể ngăn chặn các
quá trình từ những tài nguyên đang yêu cầu mà deadlock xảy ra: hành vi của các quá
trình này điều khiển các trạng thái không an toàn.
Hình 0-4 Không gian trạng thái an toàn, không an toàn, deadlock
Để minh hoạ, chúng ta xét một hệ thống với 12 ổ băng từ và 3 quá trình: P0,
P1, P2. Quá trình P0 yêu cầu 10 ổ băng từ, quá trình P1 có thể cần 4 và quá trình P2 có
thể cần tới 9 ổ băng từ. Giả sử rằng tại thời điểm t0, quá trình P0 giữ 5 ổ băng từ, quá
trình P1 giữ 2 và quá trình P2 giữ 2 ổ băng từ. (Do đó, có 3 ổ băng từ còn rảnh).
Nhu cầu tối đa Nhu cầu hiện tại
P0 10 5
P1 4 2
P2 9 2
Tại thời điểm t0, hệ thống ở trạng thái an toàn. Thứ tự <P1,P0, P2> thoả điều kiện
an toàn vì quá trình P1 có thể được cấp phát tức thì tất cả các ổ đĩa từ và sau đó trả lại
chúng (sau đó hệ thống có 5 ổ băng từ sẳn dùng ), sau đó quá trình P0 có thể nhận tất
cả ổ băng từ và trả lại chúng (sau đó hệ thống sẽ có 10 ổ băng từ sẳn dùng), và cuối
cùng quá trình P2 có thể nhận tất cả ổ băng từ của nó và trả lại chúng (sau đó hệ thống
sẽ có tất cả 12 ổ băng từ sẳn dùng).
Một hệ thống có thể đi từ trạng thái an toàn tới một trạng thái không an toàn.
Giả sử rằng tại thời điểm t1, quá trình P2 yêu cầu và được cấp 1 ổ băng từ nữa. Hệ
thống không còn trong trạng thái an toàn. Tại điểm này, chỉ quá trình P1 có thể được
cấp tất cả ổ băng từ của nó. Khi nó trả lại chúng, chỉ quá trình P1 có thể được cấp phát
tất cả ổ băng từ. Khi nó trả lại chúng, hệ thống chỉ còn 4 ổ băng từ sẳn có. Vì quá
trình P0 được cấp phát 5 ổ băng từ, nhưng có tối đa 10, quá trình P0 phải chờ. Tương
tự, quá trình P2 có thể yêu cầu thêm 6 ổ băng từ và phải chờ dẫn đến deadlock.
Lỗi của chúng ta là gán yêu cầu từ quá trình P2 cho 1 ổ băng từ nữa. Nếu chúng
ta làm cho P2 phải chờ cho đến khi các quá trình khác kết thúc và giải phóng tài
nguyên của nó thì chúng ta có thể tránh deadlock.
Với khái niệm trạng thái an toàn được cho, chúng ta có thể định nghĩa các giải
thuật tránh deadlock. Ý tưởng đơn giản là đảm bảo hệ thống sẽ luôn còn trong trạng
thái an toàn. Khởi đầu, hệ thống ở trong trạng thái an toàn. Bất cứ khi nào một quá
trình yêu cầu một tài nguyên hiện có, hệ thống phải quyết định tài nguyên có thể được
cấp phát tức thì hoặc quá trình phải chờ. Yêu cầu được gán chỉ nếu việc cấp phát để
hệ thống trong trạng thái an toàn.
Trong mô hình này, nếu quá trình yêu cầu tài nguyên đang có, nó có thể vẫn
phải chờ. Do đó, việc sử dụng tài nguyên có thể chậm hơn mà không có giải thuật
Trường hợp deadlock có thể phát sinh nếu bốn điều kiện sau xảy ra cùng một
lúc trong hệ thống:
1) Loại trừ hỗ tương: ít nhất một tài nguyên phải được giữ trong chế độ
không chia sẻ; nghĩa là, chỉ một quá trình tại cùng một thời điểm có thể sử
dụng tài nguyên. Nếu một quá trình khác yêu cầu tài nguyên đó, quá trình
yêu cầu phải tạm dừng cho đến khi tài nguyên được giải phóng.
2) Giữ và chờ cấp thêm tài nguyên: quá trình phải đang giữ ít nhất một tài
nguyên và đang chờ để nhận tài nguyên thêm mà hiện đang được giữ bởi
quá trình khác.
3) Không đòi lại tài nguyên từ quá trình đang giữ chúng: Các tài nguyên
không thể bị đòi lại; nghĩa là, tài nguyên có thể được giải phóng chỉ tự ý
bởi quá trình đang giữ nó, sau khi quá trình đó hoàn thành tác vụ.
4) Tồn tại chu trình trong đồ thị cấp phát tài nguyên: một tập hợp các quá
trình {P0, P1,…,Pn} đang chờ mà trong đó P0 đang chờ một tài nguyên
được giữ bởi P1, P1 đang chờ tài nguyên đang giữ bởi P2,…,Pn-1 đang chờ
tài nguyên đang được giữ bởi quá trình P0.
Chúng ta nhấn mạnh rằng tất cả bốn điều kiện phải cùng phát sinh để deadlock
xảy ra. Điều kiện chờ đợi ch trình đưa đến điều kiện giữ-và-chờ vì thế bốn điều kiện
không hoàn toàn độc lập.
IV.2 Đồ thị cấp phát tài nguyên
Deadlock có thể mô tả chính xác hơn bằng cách hiển thị đồ thị có hướng gọi là
đồ thị cấp phát tài nguyên hệ thống. Đồ thị này chứa một tập các đỉnh V và tập hợp
các cạnh E. Một tập các đỉnh V được chia làm hai loại nút P = {P1, P2,…,Pn} là tập
hợp các quá trình hoạt động trong hệ thống, và R = {R1, R2, ..., Rm} là tập hợp chứa
tất cả các loại tài nguyên trong hệ thống.
Một cạnh có hướng từ quá trình Pi
tới loại tài nguyên Rj được ký hiệu Pi →Rj
;
nó biểu thị rằng quá trình Pi đã yêu cầu loại tài nguyên Rj
và hiện đang chờ loại tài
nguyên đó. Một cạnh có hướng từ loại tài nguyên Rj
tới quá trình Pi được hiển thị bởi
Rj → Pi
; nó hiển thị rằng thể hiện của loại tài nguyên Rj đã được cấp phát tới quá trình
Pi
. Một cạnh có hướng Pi → Rj được gọi là cạnh yêu cầu; một cạnh có hướng Rj → Pi
được gọi là cạnh gán.
Bằng hình tượng, chúng ta hiển thị mỗi quá trình Pi
là một hình tròn, và mỗi
loại tài nguyên Rj
là hình chữ nhật. Vì loại tài nguyên Rj
có thể có nhiều hơn một thể
hiện, chúng ta hiển thị mỗi thể hiện là một chấm nằm trong hình vuông. Chú ý rằng
một cạnh yêu cầu trỏ tới chỉ một hình vuông Rj
, trái lại một cạnh gán cũng phải gán
tới một trong các dấu chấm trong hình vuông.
Khi quá trình Pi
yêu cầu một thể hiện của loại tài nguyên Rj
, một cạnh yêu cầu
được chèn vào đồ thị cấp phát tài nguyên. Khi yêu cầu này có thể được đáp ứng, cạnh
yêu cầu lập tức được truyền tới cạnh gán. Khi quá trình không còn cần truy xuất tới
tài nguyên, nó giải phóng tài nguyên, và khi đó dẫn đến cạnh gán bị xoá.
Đồ thị cấp phát tài nguyên được hiển thị trong hình VI-1 dưới đây mô tả trường hợp
sau:
Hình 0-1 Đồ thị cấp phát tài nguyên
• Các tập P, R, và E:
o P = {P1, P2, P3}
o R = {R1, R2, R3, R4}
o E = {P1→R1, P2 →R3, R1 →P2, R2→P2, R3→P3}
• Các thể hiện tài nguyên
o Một thể hiện của tài nguyên loại R1
o Hai thể hiện của tài nguyên loại R2
o Một thể hiện của tài nguyên loại R3
o Một thể hiện của tài nguyên loại R4
• Trạng thái quá trình
o Quá trình P1 đang giữ một thể hiện của loại tài nguyên R2 và đang chờ
một thể hiện của loại tài nguyên R1.
o Quá trình P2 đang giữ một thể hiện của loại tài nguyên R1 và R2 và
đang chờ một thể hiện của loại tài nguyên R3.
o Quá trình P3 đang giữ một thể hiện của R3
Đồ thị cấp phát tài nguyên hiển thị rằng, nếu đồ thị không chứa chu trình, thì
không có quá trình nào trong hệ thống bị deadlock. Nếu đồ thị có chứa chu trình, thì
deadlock có thể tồn tại.
Nếu mỗi loại tài nguyên có chính xác một thể hiện, thì một chu trình ngụ ý rằng
một deadlock xảy ra. Nếu một chu trình bao gồm chỉ một tập hợp các loại tài nguyên,
mỗi loại tài nguyên chỉ có một thể hiện thì deadlock xảy ra. Mỗi quá trình chứa trong
chu trình bị deadlock. Trong trường hợp này, một chu trình trong đồ thị là điều kiện
cần và đủ để tồn tại deadlock.
Nếu mỗi loại tài nguyên có nhiều thể hiện thì chu trình không ngụ ý deadlock
xảy. Trong trường hợp này, một chu trình trong đồ thị là điều kiện cần nhưng chưa đủ
để tồn tại deadlock.
Để hiển thị khái niệm này, chúng ta xem lại đồ thị ở hình VII-1 ở trên. Giả sử
quá trình P3 yêu cầu một thể hiện của loại tài nguyên R2. Vì không có thể hiện tài
nguyên hiện có, một cạnh yêu cầu P3 → R2 được thêm vào đồ thị (hình VI-2). Tại thời
điểm này, hai chu trình nhỏ tồn tại trong hệ thống:
P1 → R1 → P2 → R3 → P3 → R2 → P1
P2 → R3 → P3 → R2 → P2
Hình 0-2 Đồ thị cấp phát tài nguyên với deadlock
Quá trình P1, P2, và P3 bị deadlock. Quá trình P3 đang chờ tài nguyên R3, hiện
được giữ bởi quá trình P2. Hay nói cách khác, quá trình P3 đang chờ quá trình P1 hay
P2 giải phóng tài nguyên R2. Ngoài ra, quá trình P1 đang chờ quá trình P2 giải phóng
tài nguyên R1.
Bây giờ xem xét đồ thị cấp phát tài nguyên trong hình VI-3 dưới đây. Trong thí
dụ này, chúng ta cũng có một chu kỳ
P1 → R1 → P3 → R2 → P1
Hình 0-3 Đồ thị cấp phát tài nguyên có chu trình nhưng không bị deadlock
Tuy nhiên, không có deadlock. Chú ý rằng quá trình P4 có thể giải phóng thể
hiện của loại tài nguyên R2. Tài nguyên đó có thể được cấp phát tới P3 sau đó, chu
trình sẽ không còn.
Tóm lại, nếu đồ thị cấp phát tài nguyên không có chu trình thì hệ thống không
có trạng thái deadlock. Ngoài ra, nếu có chu trình thì có thể có hoặc không trạng thái
deadlock. Nhận xét này là quan trọng khi chúng ta giải quyết vấn đề deadlock.
V Các phương pháp xử lý deadlock
Phần lớn, chúng ta có thể giải quyết vấn đề deadlock theo một trong ba cách:
• Chúng ta có thể sử dụng một giao thức để ngăn chặn hay tránh deadlocks, đảm
bảo rằng hệ thống sẽ không bao giờ đi vào trạng thái deadlock
• Chúng ta có thể cho phép hệ thống đi vào trạng thái deadlock, phát hiện nó và
phục hồi.
• Chúng ta có thể bỏ qua hoàn toàn vấn đề này và giả vờ deadlock không bao
giờ xảy ra trong hệ thống. Giải pháp này được dùng trong nhiều hệ điều hành,
kể cả UNIX.
• Chúng ta sẽ tìm hiểu vắn tắt mỗi phương pháp. Sau đó, chúng ta sẽ trình bày
các giải thuật một cách chi tiết trong các phần sau đây.
Để đảm bảo deadlock không bao giờ xảy ra, hệ thống có thể dùng kế hoạch
ngăn chặn hay tránh deadlock. Ngăn chặn deadlock là một tập hợp các phương pháp
để đảm bảo rằng ít nhất một điều kiện cần (trong phần VI.4.1) không thể xảy ra. Các
phương pháp này ngăn chặn deadlocks bằng cách ràng buộc yêu cầu về tài nguyên
được thực hiện như thế nào. Chúng ta thảo luận phương pháp này trong phần sau.
Ngược lại, tránh deadlock yêu cầu hệ điều hành cung cấp những thông tin bổ
sung tập trung vào loại tài nguyên nào một quá trình sẽ yêu cầu và sử dụng trong thời
gian sống của nó. Với những kiến thức bổ sung này, chúng ta có thể quyết định đối
với mỗi yêu cầu quá trình nên chờ hay không. Để quyết định yêu cầu hiện tại có thể
được thoả mãn hay phải bị trì hoãn, hệ thống phải xem xét tài nguyên hiện có, tài
nguyên hiện cấp phát cho mỗi quá trình, và các yêu cầu và giải phóng tương lai của
mỗi quá trình.
Nếu một hệ thống không dùng giải thuật ngăn chặn hay tránh deadlock thì
trường hợp deadlock có thể xảy ra. Trong môi trường này, hệ thống có thể cung cấp
một giải thuật để xem xét trạng thái của hệ thống để xác định deadlock có xảy ra hay
không và giải thuật phục hồi từ deadlock.
Nếu hệ thống không đảm bảo rằng deadlock sẽ không bao giờ xảy ra và cũng
không cung cấp một cơ chế để phát hiện và phục hồi deadlock thì có thể dẫn đến
trường hợp hệ thống ở trong trạng thái deadlock. Trong trường hợp này, deadlock
không được phát hiện sẽ làm giảm năng lực hệ thống vì tài nguyên đang được giữ bởi
những quá trình mà chúng không thể thực thi, đi vào trạng thái deadlock. Cuối cùng,
hệ thống sẽ dừng các chức năng và cần được khởi động lại bằng thủ công.
Mặc dù phương pháp này dường như không là tiếp cận khả thi đối với vấn đề
deadlock nhưng nó được dùng trong một số hệ điều hành. Trong nhiều hệ thống,
deadlock xảy ra không thường xuyên; do đó phương pháp này là rẻ hơn chi phí cho
phương pháp ngăn chặn deadlock, tránh deadlock, hay phát hiện và phục hồi deadlock
mà chúng phải được sử dụng liên tục. Trong một số trường hợp, hệ thống ở trong
trạng thái cô đặc nhưng không ở trạng thái deadlock. Như thí dụ, xem xét một quá
trình thời thực chạy tại độ ưu tiên cao nhất (hay bất cứ quá trình đang chạy trên bộ
định thời biểu không trưng dụng) và không bao giờ trả về điều khiển đối với hệ điều
hành. Do đó, hệ thống phải có phương pháp phục hồi bằng thủ công cho các điều
kiện không deadlock và có thể đơn giản sử dụng các kỹ thuật đó cho việc phục hồi
deadlock.
VI Ngăn chặn deadlock
Để deadlock xảy ra, một trong bốn điều kiện cần phải xảy ra. Bằng cách đảm
bảo ít nhất một trong bốn điều kiện này không thể xảy ra, chúng ta có thể ngăn chặn
việc xảy ra của deadlock. Chúng ta tìm hiểu tỷ mỹ tiếp cận này bằng cách xem xét
mỗi điều kiện cần riêng rẻ nhau.
VI.1 Loại trừ hỗ tương
Điều kiện loại trừ hỗ tương phải giữ cho tài nguyên không chia sẻ. Thí dụ, một
máy in không thể được chia sẻ cùng lúc bởi nhiều quá trình. Ngược lại, các tài nguyên
có thể chia sẻ không đòi hỏi truy xuất loại trừ hỗ tương và do đó không thể liên quan
đến deadlock. Những tập tin chỉ đọc là một thí dụ tốt cho tài nguyên có thể chia sẻ.
Nếu nhiều quá trình cố gắng mở một tập tin chỉ đọc tại cùng một thời điểm thì chúng
có thể được gán truy xuất cùng lúc tập tin. Một quá trình không bao giờ yêu cầu chờ
tài nguyên có thể chia sẻ. Tuy nhiên, thường chúng ta không thể ngăn chặn deadlock
bằng cách từ chối điều kiện loại trừ hỗ tương: một số tài nguyên về thực chất không
thể chia sẻ.
VI.2 Giữ và chờ cấp thêm tài nguyên
Để đảm bảo điều kiện giữ-và-chờ cấp thêm tài nguyên không bao giờ xảy ra
trong hệ thống, chúng ta phải đảm bảo rằng bất cứ khi nào một quá trình yêu cầu tài
nguyên, nó không giữ bất cứ tài nguyên nào khác. Một giao thức có thể được dùng là
đòi hỏi mỗi quá trình yêu cầu và được cấp phát tất cả tài nguyên trước khi nó bắt đầu
thực thi. Chúng ta có thể cài đặt sự cung cấp này bằng cách yêu cầu các lời gọi hệ
thống yêu cầu tài nguyên cho một quá trình trước tất cả các lời gọi hệ thống khác.
Một giao thức khác cho phép một quá trình yêu cầu tài nguyên chỉ khi quá trình
này không có tài nguyên nào. Một quá trình có thể yêu cầu một số tài nguyên và dùng
chúng. Tuy nhiên, trước khi nó có thể yêu cầu bất kỳ tài nguyên bổ sung nào, nó phải
giải phóng tất cả tài nguyên mà nó hiện đang được cấp phát.
Để hiển thị sự khác nhau giữa hai giao thức, chúng ta xét một quá trình chép dữ
liệu từ băng từ tới tập tin đĩa, sắp xếp tập tin đĩa và sau đó in kết quả ra máy in. Nếu
tất cả tài nguyên phải được yêu cầu cùng một lúc thì khởi đầu quá trình phải yêu cầu
băng từ, tập tin đĩa và máy in. Nó sẽ giữ máy in trong toàn thời gian thực thi của nó
mặc dù nó cần máy in chỉ ở giai đoạn cuối.
Phương pháp thứ hai cho phép quá trình yêu cầu ban đầu chỉ băng từ và tập tin
đĩa. Nó chép dữ liệu từ băng từ tới đĩa, rồi giải phóng cả hai băng từ và đĩa. Sau đó,
quá trình phải yêu cầu lại tập tin đĩa và máy in. Sau đó, chép tập tin đĩa tới máy in, nó
giải phóng hai tài nguyên này và kết thúc.
Hai giao thức này có hai nhược điểm chủ yếu. Thứ nhất, việc sử dụng tài
nguyên có thể chậm vì nhiều tài nguyên có thể được cấp nhưng không được sử dụng
trong thời gian dài. Trong thí dụ được cho, chúng ta có thể giải phóng băng từ và tập
tin đĩa, sau đó yêu cầu lại tập tin đĩa và máy in chỉ nếu chúng ta đảm bảo rằng dữ liệu
của chúng ta sẽ vẫn còn trên tập tin đĩa. Nếu chúng ta không thể đảm bảo rằng dữ liệu
vẫn còn tập tin đĩa thì chúng ta phải yêu cầu tất cả tài nguyên tại thời điểm bắt đầu
cho cả hai giao thức. Thứ hai, đói tài nguyên là có thể. Một quá trình cần nhiều tài
nguyên phổ biến có thể phải đợi vô hạn định vì một tài nguyên mà nó cần luôn được
cấp phát cho quá trình khác.
VI.3 Không đòi lại tài nguyên từ quá trình đang giữ chúng
Điều kiện cần thứ ba là không đòi lại những tài nguyên đã được cấp phát rồi. Để
đảm bảo điều kiện này không xảy ra, chúng ta có thể dùng giao thức sau. Nếu một quá
trình đang giữ một số tài nguyên và yêu cầu tài nguyên khác mà không được cấp phát
tức thì tới nó (nghĩa là, quá trình phải chờ) thì tất cả tài nguyên hiện đang giữ được
đòi lại. Nói cách khác, những tài nguyên này được giải phóng hoàn toàn. Những tài
nguyên bị đòi lại được thêm tới danh sách các tài nguyên mà quá trình đang chờ. Quá
trình sẽ được khởi động lại chỉ khi nó có thể nhận lại tài nguyên cũ của nó cũng như
các tài nguyên mới mà nó đang yêu cầu.
Có một sự chọn lựa khác, nếu một quá trình yêu cầu một số tài nguyên, đầu tiên
chúng ta kiểm tra chúng có sẳn không. Nếu tài nguyên có sẳn, chúng ta cấp phát
chúng. Nếu tài nguyên không có sẳn, chúng ta kiểm tra chúng có được cấp phát tới
một số quá trình khác đang chờ tài nguyên bổ sung. Nếu đúng như thế, chúng ta lấy
lại tài nguyên mong muốn đó từ quá trình đang đợi và cấp chúng cho quá trình đang
yêu cầu. Nếu tài nguyên không sẳn có hay được giữ bởi một quá trình đang đợi, quá
trình đang yêu cầu phải chờ. Trong khi nó đang chờ, một số tài nguyên của nó có thể
được đòi lại chỉ nếu quá trình khác yêu cầu chúng. Một quá trình có thể được khởi
động lại chỉ khi nó được cấp các tài nguyên mới mà nó đang yêu cầu và phục hồi bất
cứ tài nguyên nào đã bị lấy lại trong khi nó đang chờ.
Giao thức này thường được áp dụng tới tài nguyên mà trạng thái của nó có thể
được lưu lại dễ dàng và phục hồi lại sau đó, như các thanh ghi CPU và không gian bộ
nhớ. Nó thường không thể được áp dụng cho các tài nguyên như máy in và băng từ.
VI.4 Tồn tại chu trình trong đồ thị cấp phát tài nguyên
Điều kiện thứ tư và cũng là điều kiện cuối cùng cho deadlock là điều kiện tồn
tại chu trình trong đồ thị cấp phát tài nguyên. Một cách để đảm bảo rằng điều kiện này
không bao giờ xảy ra là áp đặt toàn bộ thứ tự của tất cả loại tài nguyên và đòi hỏi mỗi
quá trình trong thứ tự tăng của số lượng.
Gọi R = {R1, R2, …, Rm} là tập hợp loại tài nguyên. Chúng ta gán mỗi loại tài
nguyên một số nguyên duy nhất, cho phép chúng ta so sánh hai tài nguyên và xác định
tài nguyên này có đứng trước tài nguyên khác hay không trong thứ tự của chúng ta.
Thông thường, chúng ta định nghĩa hàm ánh xạ một-một F: R → N, ở đây N là tập
hợp các số tự nhiên. Thí dụ, nếu tập hợp các loại tài nguyên R gồm các ổ băng từ, ổ
đĩa và máy in thì hàm F có thể được định nghĩa như sau:
F(ổ băng từ) = 1,
F(đĩa từ) = 5,
F(máy in) = 12.
Bây giờ chúng ta xem giao thức sau để ngăn chặn deadlock: mỗi quá trình có
thể yêu cầu tài nguyên chỉ trong thứ tự tăng của số lượng. Nghĩa là, một quá trình ban
đầu có thể yêu cầu bất cứ số lượng thể hiện của một loại tài nguyên Ri
. Sau đó, một
quá trình có thể yêu cầu các thể hiện của loại tài nguyên Rj
nếu và chỉ nếu F(Rj
) >
F(Ri
). Nếu một số thể hiện của cùng loại tài nguyên được yêu cầu, thì một yêu cầu
cho tất cả thể hiện phải được cấp phát. Thí dụ, sử dụng hàm được định nghĩa trước đó,
một quá trình muốn dùng ổ băng từ và máy in tại cùng một lúc trước tiên phải yêu cầu
ổ băng từ và sau đó yêu cầu máy in.
Nói một cách khác, chúng ta yêu cầu rằng, bất cứ khi nào một quá trình yêu cầu
một thể hiện của loại tài nguyên Rj
, nó giải phóng bất cứ tài nguyên Ri
sao cho F(Ri
) ≥
F(Rj
).
Nếu có hai giao thức được dùng thì điều kiện tồn tại chu trình không thể xảy ra.
Chúng ta có thể giải thích điều này bằng cách cho rằng tồn tại chu trình trong đồ thị
cấp phát tài nguyên tồn tại. Gọi tập hợp các quá trình chứa tồn tại chu trình trong đồ
thị cấp phát tài nguyên là {P0, P1, … , Pn}, ở đây Pi đang chờ một tài nguyên Ri
, mà Ri
được giữ bởi quá trình Pi+1. Vì sau đó quá trình Pi+1 đang giữ tài nguyên Ri
trong khi
yêu cầu tài nguyên Ri+1, nên chúng ta có F(Ri
) < F(Ri+1) cho tất cả i. Nhưng điều kiện
này có nghĩa là F(R0) < F(R1) < …< F(Rn) < F(R0). Bằng qui tắc bắt cầu F(R0) <
F(R0), điều này là không thể. Do đó, không thể có chờ chu trình.
Chú ý rằng hàm F nên được định nghĩa dựa theo thứ tự tự nhiên của việc sử
dụng tài nguyên trong hệ thống. Thí dụ, vì ổ băng từ thường được yêu cầu trước máy
in nên có thể hợp lý để định nghĩa F( ổ băng từ) < F(máy in).
VIITránh deadlock
Các giải thuật ngăn chặn deadlock, được thảo luận ở VII-6, ngăn chặn deadlock
bằng cách hạn chế cách các yêu cầu có thể được thực hiện. Các ngăn chặn đảm bảo
rằng ít nhất một trong những điều kiện cần cho deadlock không thể xảy ra. Do đó,
deadlock không thể xảy ra. Tuy nhiên, các tác dụng phụ có thể ngăn chặn deadlock
bởi phương pháp này là việc sử dụng thiết bị chậm và thông lượng hệ thống bị giảm.
Một phương pháp khác để tránh deadlock là yêu cầu thông tin bổ sung về cách
tài nguyên được yêu cầu. Thí dụ, trong một hệ thống với một ổ băng từ và một máy
in, chúng ta có thể bảo rằng quá trình P sẽ yêu cầu ổ băng từ trước và sau đó máy in
trước khi giải phóng cả hai tài nguyên. Trái lại, quá trình Q sẽ yêu cầu máy in trước
và sau đó ổ băng từ. Với kiến thức về thứ tự hoàn thành của yêu cầu và giải phóng
cho mỗi quá trình, chúng ta có thể quyết định cho mỗi yêu cầu của quá trình sẽ chờ
hay không. Mỗi yêu cầu đòi hỏi hệ thống xem tài nguyên hiện có, tài nguyên hiện
được cấp tới mỗi quá trình, và các yêu cầu và giải phóng tương lai của mỗi quá trình,
để yêu cầu của quá trình hiện tại có thể được thoả mãn hay phải chờ để tránh khả năng
xảy ra deadlock.
Các giải thuật khác nhau có sự khác nhau về lượng và loại thông tin được yêu
cầu. Mô hình đơn giản và hữu ích nhất yêu cầu mỗi quá trình khai báo số lớn nhất tài
nguyên của mỗi loại mà nó cần. Thông tin trước về số lượng tối đa tài nguyên của mỗi
loại được yêu cầu cho mỗi quá trình, có thể xây dựng một giải thuật đảm bảo hệ thống
sẽ không bao giờ đi vào trạng thái deadlock. Đây là giải thuật định nghĩa tiếp cận
tránh deadlock. Giải thuật tránh deadlock tự xem xét trạng thái cấp phát tài nguyên để
đảm bảo điều kiện tồn tại chu trình trong đồ thị cấp phát tài nguyên có thể không bao
giờ xảy ra. Trạng thái cấp phát tài nguyên được định nghĩa bởi số tài nguyên sẳn dùng
và tài nguyên được cấp phát và số yêu cầu tối đa của các quá trình.
VII.1 Trạng thái an toàn
Một trạng thái là an toàn nếu hệ thống có thể cấp phát các tài nguyên tới mỗi
quá trình trong một vài thứ tự và vẫn tránh deadlock. Hay nói cách khác, một hệ thống
ở trong trạng thái an toàn chỉ nếu ở đó tồn tại một thứ tự an toàn. Thứ tự của các quá
trình <P1, P2, …, Pn> là một thứ tự an toàn cho trạng thái cấp phát hiện hành nếu đối với mỗi thứ tự Pi
, các tài nguyên mà Pi
yêu cầu vẫn có thể được thoả mãn bởi tài
nguyên hiện có cộng với các tài nguyên được giữ bởi tất cả Pj
, với j<i. Trong trường
hợp này, nếu những tài nguyên mà quá trình Pi
yêu cầu không sẳn dùng tức thì thì Pi
có thể chờ cho đến khi tất cả Pj
hoàn thành. Khi chúng hoàn thành, Pi
có thể đạt được
tất cả những tài nguyên nó cần, hoàn thành các tác vụ được gán, trả về những tài
nguyên được cấp phát cho nó và kết thúc. Khi Pi
kết thúc, Pi+1 có thể đạt được các tài
nguyên nó cần,... Nếu không có thứ tự như thế tồn tại thì trạng thái hệ thống là không
an toàn.
Một trạng thái an toàn không là trạng thái deadlock. Do đó, trạng thái
deadlock là trạng thái không an toàn. Tuy nhiên, không phải tất cả trạng thái không an
toàn là deadlock (hình VI-4). Một trạng thái không an toàn có thể dẫn đến deadlock.
Với điều kiện trạng thái là an toàn, hệ điều hành có thể tránh trạng thái không an toàn
(và deadlock). Trong một trạng thái không an toàn, hệ điều hành có thể ngăn chặn các
quá trình từ những tài nguyên đang yêu cầu mà deadlock xảy ra: hành vi của các quá
trình này điều khiển các trạng thái không an toàn.
Hình 0-4 Không gian trạng thái an toàn, không an toàn, deadlock
Để minh hoạ, chúng ta xét một hệ thống với 12 ổ băng từ và 3 quá trình: P0,
P1, P2. Quá trình P0 yêu cầu 10 ổ băng từ, quá trình P1 có thể cần 4 và quá trình P2 có
thể cần tới 9 ổ băng từ. Giả sử rằng tại thời điểm t0, quá trình P0 giữ 5 ổ băng từ, quá
trình P1 giữ 2 và quá trình P2 giữ 2 ổ băng từ. (Do đó, có 3 ổ băng từ còn rảnh).
Nhu cầu tối đa Nhu cầu hiện tại
P0 10 5
P1 4 2
P2 9 2
Tại thời điểm t0, hệ thống ở trạng thái an toàn. Thứ tự <P1,P0, P2> thoả điều kiện
an toàn vì quá trình P1 có thể được cấp phát tức thì tất cả các ổ đĩa từ và sau đó trả lại
chúng (sau đó hệ thống có 5 ổ băng từ sẳn dùng ), sau đó quá trình P0 có thể nhận tất
cả ổ băng từ và trả lại chúng (sau đó hệ thống sẽ có 10 ổ băng từ sẳn dùng), và cuối
cùng quá trình P2 có thể nhận tất cả ổ băng từ của nó và trả lại chúng (sau đó hệ thống
sẽ có tất cả 12 ổ băng từ sẳn dùng).
Một hệ thống có thể đi từ trạng thái an toàn tới một trạng thái không an toàn.
Giả sử rằng tại thời điểm t1, quá trình P2 yêu cầu và được cấp 1 ổ băng từ nữa. Hệ
thống không còn trong trạng thái an toàn. Tại điểm này, chỉ quá trình P1 có thể được
cấp tất cả ổ băng từ của nó. Khi nó trả lại chúng, chỉ quá trình P1 có thể được cấp phát
tất cả ổ băng từ. Khi nó trả lại chúng, hệ thống chỉ còn 4 ổ băng từ sẳn có. Vì quá
trình P0 được cấp phát 5 ổ băng từ, nhưng có tối đa 10, quá trình P0 phải chờ. Tương
tự, quá trình P2 có thể yêu cầu thêm 6 ổ băng từ và phải chờ dẫn đến deadlock.
Lỗi của chúng ta là gán yêu cầu từ quá trình P2 cho 1 ổ băng từ nữa. Nếu chúng
ta làm cho P2 phải chờ cho đến khi các quá trình khác kết thúc và giải phóng tài
nguyên của nó thì chúng ta có thể tránh deadlock.
Với khái niệm trạng thái an toàn được cho, chúng ta có thể định nghĩa các giải
thuật tránh deadlock. Ý tưởng đơn giản là đảm bảo hệ thống sẽ luôn còn trong trạng
thái an toàn. Khởi đầu, hệ thống ở trong trạng thái an toàn. Bất cứ khi nào một quá
trình yêu cầu một tài nguyên hiện có, hệ thống phải quyết định tài nguyên có thể được
cấp phát tức thì hoặc quá trình phải chờ. Yêu cầu được gán chỉ nếu việc cấp phát để
hệ thống trong trạng thái an toàn.
Trong mô hình này, nếu quá trình yêu cầu tài nguyên đang có, nó có thể vẫn
phải chờ. Do đó, việc sử dụng tài nguyên có thể chậm hơn mà không có giải thuật
lequanghanh(102c)- Tổng số bài gửi : 61
Join date : 18/02/2011
Age : 38
Đến từ : Phương Đông - Trà Đông - Bắc Trà My - Quảng Nam
Similar topics
» Thảo luận Bài 8
» Thảo luận Bài 8
» Thảo luận Bài 8
» Bốn điều kiện dẫn đến Deadlock là những điều kiện gì?
» Thảo luận Bài 8
» Thảo luận Bài 8
» Thảo luận Bài 8
» Bốn điều kiện dẫn đến Deadlock là những điều kiện gì?
» Thảo luận Bài 8
Trang 1 trong tổng số 1 trang
Permissions in this forum:
Bạn không có quyền trả lời bài viết