Tình trạng khóa chết (Deadlock) là một trạng thái xuất hiện trong môi trường đa nhiệm (multi-threading) khi hai hoặc nhiều tiến trình bị kẹt trong vòng lặp chờ tài nguyên vô tận.
Ví dụ minh họa
Thread 1 | Thread 2 |
---|---|
Muốn lấy tài nguyên A và B | Muốn lấy tài nguyên A và B |
Chiếm tài nguyên A, chờ Thread 2 bắt đầu chạy cho tới khi Thread 2 đợi tài nguyên A giải phóng |
|
Chiếm tài nguyên B | |
Đợi tài nguyên A giải phóng | |
Đợi tài nguyên B giải phóng | |
Deadlock |
Cách xử lý tình trạng khóa chết
Các điều kiện gây ra tình trạng khóa chết
Để xảy ra deadlock, có bốn điều kiện cần thiết.
- Điều kiện loại trừ tương hỗ (Mutual exclusion): Một tài nguyên chỉ có thể được sử dụng bởi một tiến trình duy nhất vào một thời điểm
- Điều kiện giữ và chờ (Hold and wait): Một tiến trình giữ ít nhất một tài nguyên và đang chờ đợi tài nguyên khác do tiến trình khác đang giữ
- Điều kiện không ưu tiên (No preemption): Tài nguyên không thể bị thu hồi, chỉ có thể được giải phóng bởi tiến trình nắm giữ
- Điều kiện chu trình chờ (Circular wait): Các tiến trình giữ tài nguyên và chờ tài nguyên được giữ bởi tiến trình khác, tạo thành một chu trình. Ví dụ: Tiến trình 1, chiếm A1, chờ A2. Tiến trình 2 chiếm A2, chờ A3,... Tiến trình N chiếm An, chờ A1
Các phương pháp đối phó với deadlock
- Ngăn chặn deadlock: Ngăn chặn ít nhất một trong bốn điều kiện cần thiết để deadlock xảy ra. Ví dụ: cho phép chia sẻ tài nguyên, cho phép giải phóng tài nguyên,...
- Phòng tránh deadlock: Dự đoán trước khi phân phối tài nguyên cho tiến trình để xem liệu deadlock có xảy ra hay không. Ví dụ: Giải thuật ngân hàng (Banker's algorithm).
- Phát hiện và khắc phục deadlock: Nếu không thể phòng tránh hoặc ngăn chặn deadlock, để cho deadlock xảy ra và sau đó phát hiện và khắc phục chúng. Phương pháp này phù hợp với hệ thống ít xảy ra deadlock và hậu quả của deadlock không nghiêm trọng.