581 likes | 1.31k Views
Ch ương 7: Deadlock (khoá chết). Nguyễn Đôn Quang Trí Nguyễn Thanh Tuấn. Ch ương 7: Deadlock. Các vấn đề về Deadlock Mô hình hệ thống Mô tả Deadlock Phương pháp để xử lý Deadlock Phòng chống Deadlock Tránh Deadlock Phát hiện Deadlock Phục hồi từ Deadlock. Mục đích của chương.
E N D
Chương 7: Deadlock (khoá chết) Nguyễn Đôn Quang Trí Nguyễn Thanh Tuấn
Chương 7: Deadlock • Các vấn đề về Deadlock • Mô hình hệ thống • Mô tả Deadlock • Phương pháp để xử lý Deadlock • Phòng chống Deadlock • Tránh Deadlock • Phát hiện Deadlock • Phục hồi từ Deadlock
Mục đích của chương • Để mô tả deadlocks, nhằm ngăn chặn hoàn toàn các tiến trình xảy ra từ việc hoàn thành công việc của chúng. • Để giới thiệu một số các phương pháp khác nhau hoặc tránh deadlock trong một hệ thống máy tính.
Các vấn đề Deadlock • Là một tập các tiến trình mỗi tiến trình nắm giữ một tài nguyên và việc chờ để thu được một tài nguyên khác được nắm giữ bởi một tiến trình khác trong tập. • Ví dụ • Hệ thống có 2 đĩa cứng. • Tiến trình P1 và P2 mỗi tiến trình nắm giữ một đĩa và mỗi nhu cầu của một số khác. • Ví dụ • Tín hiệu cờ A và B, khởi tạo ban đầu là 1 P0P1 chờ (A); chờ (B) chờ (B); chờ (A)
Ví dụ qua cầu • Sự giao thông 1 chiều. • Tất cả các phần của một cầu có thể được xem như là một nguồn tài nguyên. • Nếu deadlock xảy ra, nó có thể được giải quyết nếu một chiếc xe hơi lùi lại (ưu tiên cho các nguồn tài nguyên và phục hồi). • Một số chiếc xe có thể bị tắc nghẽn nếu deadlock xảy ra.
Mô hình hệ thống • Nguồn tài nguyên loại R1, R2, . . ., Rm Chu kỳ CPU , không gian nhớ, thiết bị vào/ra • Mỗi loại tài nguyên Ri lại có Wi trường. • Mỗi tiến trình lại sử dụng lại sử dụng một nguồn tài nguyên như sau: • Yêu cầu • Sử dụng • Thoát
Mô tả Deadlock Deadlock có thể xảy ra nếu 4 trạng thái giữ xảy ra cùng một lúc. • Loại trừ lẫn nhau: chỉ một tiến trình hiện thời có thể sử dụng một nguồn tài nguyên. • Giữ và chờ đợi: Một tiến trình nắm giữ ít nhất một nguồn tài nguyên là việc chờ đợi để thu được bổ sung nguồn tài nguyên được nắm giữ bởi các tiến trình khác. • Không có sự ưu tiên: Một nguồn tài nguyên có thể được giả phóng chỉ tự ý bởi tiến trình nắm giữ nó, sau đó tiến trình đó đã hoàn thành tác vụ của nó. • Chu trình chờ đợi: một tập hợp các tiến trình {P0, P1, …, P0} đang chờ mà trong đó P0 đang chờ một nguồn tài nguyên được nắm giữ bởi P1, P1 đang chờ tài nguyên được giữ bởi P2, …, Pn–1 đang chờ tài nguyên đang được giữ bởi quá trình Pn, and P0 đang chờ tài nguyên đang được giữ bởi quá trình P0.
Đồ thị cấp phát tài nguyên Đồ 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. • 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. • Cạnh yêu cầu – hướng cạnh từ Pi Rj • Cạnh gán - hướng cạnh từRj Pi
Đồ thị cấp phát tài nguyên (Tiếp.) • Tiến trình • Loại tài nguyên với 4 thể hiện • Piyêu cầu thể hiện của Rj • Pi đang giữ một đối tượng của Rj Pi Rj Pi Rj
Đồ thị cấp phát tài nguyên có chu trình nhưng không có deadlock
Tóm lại • Nếu đồ thị cấp phát tài nguyên không có chu trình không có deadlock. • Nếu đồ thị cấp phát tài nguyên có chu trình • Mỗi loại tài nguyên có đúng một thể hiện, thì có deadlock. • Nếu một loại tài ngugyên có nhiều thể hiện thì có thể có deadlock.
Ví dụ Java về Deadlock Luồng A Luồng B
Ví dụ về Java Deadlock Deadlock có thể có nếu: Luồng A -> khoá Y -> Luồng B -> khoá X -> Luồng A
Các phương pháp xử lý Deadlocks • Đảm bảo rằng hệ thống sẽ không bao giờ rơi vào tình trạng deadlock. • Có thể cho phép hệ thống đi vào deadlock, phát hiện nó và phục hồi. • Có thể bỏ qua 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.
Ngăn chặn deadlock Ngăn chặn deadlock có thể được thực hiện bởi các cách sau. • Loại trừ hỗ tương – không cần thiết để chia sẻ tài nguyên; một số tài nguyên về thực chất không thể chia sẻ. • Giữ và chờ cấp thêm tài nguyên – phải đảm bảo rằng khi một tiến trình yêu cầu cấp thêm tài nguyên, nó không nắm giữ nguồn 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, hoặ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.. • Tái sử dụng nguồn tài nguyên thấp cạn kiệt; có thể bị mất đi.
Ngăn chặn deadlock (Tiếp.) • Không đòi lại tài nguyên từ quá trình đang giữ chúng – • 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. • 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ờ. • Tiến 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. • Chu trình chờ đợi – á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.
Tránh deadlock Yêu cầu hệ thống thông tin bổ sung về cách tài nguyên được yêu cầu. • Đơ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. • 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. • 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.
Trạng thái an toàn • Khi một tiến trình yêu cầu một nguồn tài nguyên sẵn có,hệ thống phải quyết định lập tức nếu nguồn tài nguyên được cấp rời khỏi hệ thống trong một trạng thái an toàn. • Hệ thống trong trạng thái an toàn nếu ở đó tồn tại một thứ tự <P1, P2, …, Pn> cho tất cả các tiến trình, đố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
Tóm lại • Nếu một hệ thống ở trong trạng thái an toàn Không có các deadlock. • Nếu một hệ thống ở trong trạng thái không an toàn có thể xảy ra deadlock. • Tránh deadlock chắc chắn rằng hệ thống sẽ không bao giờ đi vào trạng thái không an toàn.
Giải thuật tránh deadlock • Với một thể hiện của mỗi loại nguồn tài nguyên. Sử dụng một đồ thị cấp phát tài nguyên. • Với nhiều thể hiện của mỗi loại tài nguyên.Sử dụng giải thuật của Banker.
Ý tưởng đồ thị cấp phát tài nguyên • Một cạnh thỉnh cầu Pi Rj hiển thị quá trình Pi có thể yêu cầu tài nguyên Rj; được thực hiện bởi một dấu đứt khoảng. • Khi một tiến trình yêu cầu một nguồn tài nguyên cạnh thỉnh cầu chuyển tới cạnh yêu cầu . • Cạnh yêu cầu chuyển tới một cạnh gán khi nguồn tài nguyên cấp được cấp phát cho tiến trình. • Khi một nguồn tài nguyên được giải phóng bởi một tiến trình, cạnh gán chuyển trở lại thành cạnh thỉnh cầu. • Các tài nguyên phải được yêu cầu trước trong hệ thống.
Giải thuật của đồ thị cấp phát tài nguyên • Giả sử rằng Piyêu cầu tài nguyên Rj. • Yêu cầu có thể được gán chỉ nếu chuyển cạnh yêu cầu tới cạnh gán không dẫn đến việc hình thành chu trình trong đồ thị cấp phát tài nguyên.
Giải thuật Banker • Nhiều thể hiện của mỗi loại tài nguyên. • Mỗi tiến trình phải khai báo số tối đa các thể hiện của mỗi loại tài nguyên mà nó cần. • Khi một tiến trình yêu cầu một nguồn tài nguyên nó có thể phải chờ đợi. • Khi một tiến trình nhận được tất cả các nguồn tài nguyên của nó, nó phải trả lại chúng trong một khoảng thời gian có hạn.
Cấu trúc dữ liệu cho giải thuật Banker • Available: một vector có chiều dài m hiển thị số lượng tài nguyên sẳn dùng của mỗi loại. Nếu Available[j]= k, có k thể hiện của loại tài nguyên Rj sẳn dùng. • Max: một ma trận n x m định nghĩa số lượng tối đa yêu cầu của mỗi quá trình. Nếu Max[i, j] = k, thì quá trình Picó thể yêu cầu nhiều nhất k thể hiện của loại tài nguyên Rj. • Allocation: một ma trận n x m định nghĩa số lượng tài nguyên của mỗi loại hiện được cấp tới mỗi quá trình. Nếu Allocation[i, j] = k, thì quá trình Pi hiện được cấp k thể hiện của loại tài nguyên Rj. • Need: một ma trận n x m hiển thị yêu cầu tài nguyên còn lại của mỗi quá trình. Nếu Need[i, j] = k, thì quá trình Pi có thể cần thêm k thể hiện của loại tài nguyên Rj để hoàn thành tác vụ của nó. Chú ý rằng, Need [i,j] = Max[i,j] – Allocation [i,j]. Gọi n là số quá trình trong hệ thống và m là số loại tài nguyên trong hệ thống.
Giải thuật an toàn 1. Gọi Work và Finish là các vector có chiều dài m và n tương ứng. Khởi tạo: Work = Available Finish [i] = false cho i = 0, 1, …, n- 1. 2. Tìm i thoả: (a) Finish [i] = false (b) Needi Work Nếu không có i nào thỏa, di chuyển tới bước 4. 3. Work = Work + AllocationiFinish[i] = truechuyển ttới bước 2. 4. If Finish [i] == true cho tất cả i, thì hệ thống ở trong trạng thái an toàn.
Giải thuật yêu cầu tài nguyên cho tiến trìnhPi Cho Request là vector yêu cầu cho quá trìnhPi. Nếu Requesti[j] = k thì tiến trình Pi muốn k thể hiện của loại tài nguyên instances of resource type Rj.. • Nếu Requesti Needichuyển tới bước 2. Ngược lại, phát sinh một điều kiện lỗi vì quá trình vượt quá yêu cầu tối đa của nó. • Nếu Requesti Available, chuyển tới bước 3. Ngược lại Pi phải chờ, vì tài nguyên không sẵn có. 3. Giả sử hệ thống cấp phát các tài nguyên được yêu cầu tới tiến trìnhPi bằng cách thay đổi trạng thái sau: Available = Available – Request; Allocationi= Allocationi + Requesti; Needi= Needi – Requesti; • Nếu an toàn tài nguyên được cấp phát cho Pi. • Nếu không an toàn Pi phải chờ, và trạng thái cấp phát tài nguyên cũ được phục hồi.
Ví dụ cho thuật giải Banker • 5 tiến trình P0 đến P4; 3 loại tài nguyên: A (10 thể hiện), B (5 thể hiện), and C (7 thể hiện). • Trạng thái hệ thống ở thời điểm T0: AllocationMaxAvailable 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
Ví dụ (Tiếp.) • Nội dung ma trận Need được định nghĩa là Max-Allocation và là: Need A B C P0 7 4 3 P1 1 2 2 P2 6 0 0 P3 0 1 1 P4 4 3 1 • Hệ thống hiện ở trong trạng thái an toàn thứ tự thoả tiêu chuẩn < P1, P3, P4, P2, P0>.
Ví dụ: P1 Yêu cầu (1,0,2) • Kiểm tra Request Available (nghĩa là, (1,0,2) (3,3,2) true. AllocationNeedAvailable 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 1 6 0 0 P3 2 1 1 0 1 1 P4 0 0 2 4 3 1 • Thực thi giải thuật an toàn của chúng ta và tìm thứ tự< P1, P3, P4, P0, P2> thỏa yêu cầu an toàn. • Một yêu cầu (3,3,0) bởi P4 có thể được gán không? • Một yêu cầu (0,2,0) bởi P0 có thể được gán không?
Phát hiện Deadlock • Cho phép hệ thống rơi vào tình trạng deadlock. • Giải thuật để phát hiện deadlock. • Ý tưởng phục hồi.
Một thể hiện của mỗi loại tài nguyên • Đồ thị chờ wait-for • Các nút là các tiến trình. • Pi Pj nếu Piđang chờ cho Pj. • Deadlock tồn tại trong hệ thống nếu và chỉ nếu đồ thị chờ chứa chu trình. Để phát hiện deadlock, hệ thống cần duy trì đồ thị chờ và định kỳ gọi giải thuật để tìm kiếm chu trình trong đồ thị. • Một giải thuật phát hiện chu trình trong đồ thị yêu cầu độ phức tạp n2 thao tác, ở đây n là số cạnh của đồ thị.
Đồ thị cấp phát tài nguyên và đồ thị chờ. Đồ thị cấp phát tài nguyên Đồ thị chờ tương ứng
Nhiều thể hiện của một loại tài nguyên • Available: một vector độ dài m hiển thị số lượng sẵn có của mỗi loại. • Allocation: Một ma trận n x m định nghĩa số lượng tài nguyên của mỗi loại hiện được cấp phát tới mỗi tiến trình. • Request: Một ma trận n x m hiển thị yêu cầu hiện tại của mỗi tiến trình. Nếu Request [ij] = k, thì tiến trình Pi đang yêu cầu k nữa của loại tài nguyên Rj.
Giải thuật phát hiên Deadlock 1. Gọi Work và Finish là 2 vector có chiều dài m and n tương ứng, khởi tạo: (a) Work = Available (b) Cho i = 1,2, …, n, nếu Allocationi 0, thì Finish[i] = false; ngược lại, Finish[i] = true. 2. Tìm chỉ số i thoả: (a) Finish[i] == false (b) Requesti Work Nếu không có i nào thoả, chuyển tới bước 4.
Thuật giải tránh Deadlock (Tiếp.) • Work = Work + AllocationiFinish[i] = trueChuyển tới bước 2. 4. Nếu Finish[i] == false, cho một vài i, 1 i n, thì hệ thống đang ở tình trạng deadlock. Ngoài ra, nếu Finish[i] == false, thì tiến trình Pi bị deadlock. Giải thuật này yêu cầu độ phức tạp O(m x n2) để phát hiện hệ thống có ở trong tình trạng deadlock hay không.
Ví dụ cho giải thuật tránh Deadlock • 5 tiến trình P0 đến P4;3 loại tàinguyên A (7 thể hiện), B (2 thể hiện), and C (6 thể hiện). • Ở thời điểm T0 trạng thái cấp phát tài nguyên như sau: AllocationRequestAvailable A B C A B C A B C P0 0 1 0 0 0 0 0 0 0 P1 2 0 0 2 0 2 P2 3 0 3 0 0 0 P3 2 1 1 1 0 0 P4 0 0 2 0 0 2 • Thứ tự <P0, P2, P3, P1, P4> sẽ dẫn đến Finish[i] = true cho tất cả i.
Ví dụ (Tiếp.) • P2 yêu cầu thêm thể hiện của loại C. Request A B C P0 0 0 0 P1 2 0 1 P2 0 0 1 P3 1 0 0 P4 0 0 2 • Trạng thái của hệ thống? • Có thể đòi lại tài nguyên được giữ bởi tiến trìnhP0, but insufficient resources to fulfill other processes; requests. • Deadlock tồn tại, bao gồm các tiến trình P1, P2, P3, and P4.
Sử dụng giải thuật phát hiện Deadlock • Khi nào thì chúng ta nên nạp giải thuật phát hiện deadlock? Câu trả lời phụ thuộc vào hai yếu tố: • Deadlock có khả năng xảy ra thường xuyên như thế nào? • Bao nhiêu quá trình sẽ bị ảnh hưởng bởi deadlock khi nó sẽ ra? • Phân chia cho mỗi chu kỳ. • Nếu giải thuật phát hiện deadlock được nạp trong những thời điểm bất kỳ, thì có nhiều chu trình trong đồ thị tài nguyên. Chúng ta không thể nói quá trình nào của nhiều quá trình bị deadlock “gây ra” deadlock.
Phục hồi Deadlock: Kết thúc tiến trình • Huỷ bỏ tất cả các tiến trình bị deadlock. • Hủy bỏ một tiến trình tại thời điểm cho đến khi chu trình deadlock bị xóa. • Chúng ta nên chọn tiến trình nào để huỷ bỏ? • Độ ưu tiên của quá trình. • Tiến trình đã được tính toán bao lâu và bao lâu nữa quá trình sẽ tính toán trước khi hoàn thành tác vụ được chỉ định của nó. • Bao nhiêu và loại tài nguyên gì tiến trình đang sử dụng. • Bao nhiêu tài nguyên nữa tiến trình cần để hoàn thành. • Bao nhiêu tiến trình sẽ cần được kết thúc. • Tiến trình là giao tiếp hay dạng bó?
Phục hồi Deadlock: Lấy lại tài nguyên • Chọn nạn nhân – tối thiểu chi phí. • Trở lại trạng thái trước Rollback – phục hồi tiến trình tới trạng thái an toàn, khởi động lại từ trạng thái gần nhất trước đó. • Đói tài nguyên – cùng tiến trình luôn được chọn như là nạn nhân, bao gồm số lượng phục hồi trong yếu tố chi phí.