Theo cách tiếp cận này, Hệ điều hành không áp dụng bất kỳ cơ chế nào để tránh hoặc ngăn chặn các Deadlock. Do đó hệ thống nhận định rằng deadlock chắc chắn sẽ xảy ra. Để loại bỏ các Deadlock, Hệ điều hành sẽ kiểm tra định kỳ hệ thống xem có bất kỳ Deadlock nào không. Trong trường hợp, nó tìm thấy bất kỳ Deadlock nào thì hệ điều hành sẽ khôi phục hệ thống bằng cách sử dụng một số kỹ thuật khôi phục.
Các bài viết liên quan:
Nhiệm vụ chính của hệ điều hành là phát hiện các Deadlock. Hệ điều hành có thể phát hiện các Deadlock với sự trợ giúp của đồ thị phân bổ Tài nguyên.
Trong các loại tài nguyên không ổn định đơn lẻ, nếu một chu trình đang được hình thành trong hệ thống thì chắc chắn sẽ có một Deadlock. Mặt khác, trong nhiều biểu đồ kiểu tài nguyên không ổn định, việc phát hiện một chu trình là không vừa đủ. Chúng ta phải áp dụng thuật toán an toàn trên hệ thống bằng cách chuyển đồ thị phân bổ tài nguyên thành ma trận phân bổ và ma trận yêu cầu.
Để khôi phục hệ thống khỏi Deadlock, hệ điều hành sẽ xem xét tài nguyên hoặc quy trình.
Đối với tài nguyên
Miễn phí tài nguyên
Chúng ta có thể lấy một trong các tài nguyên từ chủ sở hữu của tài nguyên (tiến trình) và đưa nó cho tiến trình khác với kỳ vọng rằng nó sẽ hoàn thành việc thực thi và sẽ giải phóng tài nguyên này sớm hơn. Chà, việc chọn một nguồn tài nguyên sẽ bị lấy mất sẽ có một chút khó khăn.
Khôi phục về trạng thái an toàn
Hệ thống đi qua các trạng thái khác nhau để vào trạng thái Deadlock. Hệ điều hành có thể khôi phục hệ thống về trạng thái an toàn trước đó. Với mục đích này, OS cần thực hiện kiểm tra trỏ ở mọi trạng thái.
Vào thời điểm, chúng tôi gặp Deadlock, chúng tôi sẽ khôi phục tất cả các phân bổ để về trạng thái an toàn trước đó.
Đối với quy trình
Giết một quy trình
Giết một quy trình có thể giải quyết vấn đề của chúng ta nhưng mối quan tâm lớn hơn là quyết định giết quy trình nào. Nói chung, Hệ điều hành giết một quy trình đã thực hiện ít công việc nhất cho đến nay.
Diệt tất cả quá trình
Đây không phải là một cách tiếp cận có thể gợi ý nhưng có thể được thực hiện nếu vấn đề trở nên rất nghiêm trọng. Việc giết tất cả quy trình sẽ dẫn đến sự kém hiệu quả trong hệ thống vì tất cả các quy trình sẽ thực thi lại từ đầu.
Phát hiện bế tắc bằng RAG
Nếu một chu trình đang được hình thành trong biểu đồ phân bổ Tài nguyên trong đó tất cả các tài nguyên có một phiên bản duy nhất thì hệ thống bị bế tắc.
Trong trường hợp Đồ thị phân bổ tài nguyên với các loại tài nguyên đa phiên bản, Chu kỳ là điều kiện cần của deadlock nhưng không phải là điều kiện đủ.
Ví dụ sau đây chứa ba tiến trình P1, P2, P3 và ba tài nguyên R2, R2, R3. Tất cả các tài nguyên đều có các phiên bản đơn lẻ.
Nếu chúng ta phân tích đồ thị thì chúng ta có thể phát hiện ra rằng có một chu trình được hình thành trong đồ thị vì hệ thống thỏa mãn tất cả bốn điều kiện của deadlock.
Ma trận phân bổ
Ma trận phân bổ có thể được hình thành bằng cách sử dụng đồ thị phân bổ Tài nguyên của một hệ thống. Trong ma trận Phân bổ, một mục nhập sẽ được thực hiện cho mỗi tài nguyên được chỉ định. Ví dụ, trong ma trận sau, mục nhập đang được thực hiện ở phía trước P1 và bên dưới R3 vì R3 được gán cho P1.
Tiến trình | R1 | R2 | R3 |
P1 | 0 | 0 | 1 |
P2 | 1 | 0 | 0 |
P3 | 0 | 1 | 0 |
Yêu cầu ma trận
Trong ma trận yêu cầu, một mục nhập sẽ được thực hiện cho mỗi tài nguyên được yêu cầu. Như trong ví dụ sau, P1 cần R1, do đó một mục nhập đang được thực hiện ở phía trước P1 và bên dưới R1.
Tiến trình | R1 | R2 | R3 |
P1 | 1 | 0 | 0 |
P2 | 0 | 1 | 0 |
P3 | 0 | 0 | 1 |
Avial = (0,0,0)
Cả chúng tôi đều không có bất kỳ tài nguyên nào có sẵn trong hệ thống cũng như không có quy trình sẽ phát hành. Mỗi quy trình cần ít nhất một tài nguyên duy nhất để hoàn thành, do đó họ sẽ liên tục nắm giữ từng quy trình.
Chúng tôi không thể đáp ứng nhu cầu của ít nhất một quy trình bằng cách sử dụng các tài nguyên có sẵn, do đó hệ thống bị bế tắc như đã xác định trước đó khi chúng tôi phát hiện một chu kỳ trong biểu đồ.