Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> MySQL

Deadlock (Te nghẽn) trong DBMS

Deadlock (te nghẽn) xảy ra khi hai hoặc nhiều tiến trình cần một số tài nguyên để hoàn thành thực thi mà tài nguyên đó được giữ bởi tiến trình khác. Deadlock (Te nghẽn) trong DBMS

Trong sơ đồ trên, tiến trình 1 có tài nguyên 1 và cần tài nguyên 2. Tương tự tiến trình 2 có tài nguyên 2 và cần tài nguyên 1. Mỗi tiến trình cần tài nguyên của tiến trình kia để hoàn thành nhưng không cái nào sẵn sàng nhường tài nguyên của mình. Vì vậy, tiến trình 1 và 2 rơi vào deadlock.

Điều kiện Coffman (Coffman Conditions)

Deadlock chỉ xảy ra nếu bốn điều kiện Coffman đều đúng. Các điều kiện này không nhất thiết loại trừ lẫn nhau. Chúng là:

Loại trừ lẫn nhau (Mutual Exclusion)

Phải có một tài nguyên chỉ có thể được giữ bởi một tiến trình tại một thời điểm. Trong sơ đồ dưới, có một thể hiện đơn lẻ của tài nguyên R1 và nó được giữ bởi tiến trình P1.

Deadlock (Te nghẽn) trong DBMS

Giữ và chờ (Hold and Wait)

Một tiến trình có thể giữ nhiều tài nguyên và vẫn yêu cầu thêm tài nguyên từ các tiến trình khác đang giữ chúng. Trong sơ đồ dưới, tiến trình P1 giữ tài nguyên R1 và R2 và đang yêu cầu tài nguyên R3 được giữ bởi tiến trình P2.

Deadlock (Te nghẽn) trong DBMS

Không cướp đoạt (No Preemption)

Một tài nguyên không thể bị cướp đoạt từ một tiến trình bằng ép buộc. Một tiến trình chỉ có thể giải phóng tài nguyên tự nguyện. Trong sơ đồ dưới, tiến trình P1 không thể cướp tài nguyên R3 từ tiến trình P2. Nó chỉ được giải phóng khi P2 nhường tự nguyện sau khi thực thi xong.

Deadlock (Te nghẽn) trong DBMS

Chờ vòng tròn (Circular Wait)

Một tiến trình chờ tài nguyên được giữ bởi tiến trình thứ hai, tiến trình thứ hai chờ tài nguyên được giữ bởi tiến trình thứ ba, và cứ thế cho đến khi tiến trình cuối cùng chờ tài nguyên được giữ bởi tiến trình đầu tiên. Điều này tạo thành chuỗi vòng tròn. Ví dụ: Tiến trình P1 được cấp tài nguyên R1 và yêu cầu R2. Tương tự, tiến trình P2 được cấp R2 và yêu cầu R1. Điều này tạo thành vòng chờ tròn.

Deadlock (Te nghẽn) trong DBMS

Phát hiện Deadlock (Deadlock Detection)

Bộ điều phối tài nguyên (resource scheduler) có thể phát hiện deadlock vì nó theo dõi tất cả tài nguyên được cấp phát cho các tiến trình khác nhau. Sau khi deadlock được phát hiện, nó có thể được giải quyết bằng các phương pháp sau:

  • Tất cả tiến trình liên quan đến deadlock bị chấm dứt. Đây không phải cách tốt vì toàn bộ tiến độ của các tiến trình bị hủy.
  • Tài nguyên có thể được cướp đoạt từ một số tiến trình và đưa cho tiến trình khác cho đến khi deadlock được giải quyết.

Ngăn chặn Deadlock (Deadlock Prevention)

Cần thiết phải ngăn chặn deadlock trước khi nó xảy ra. Vì vậy, hệ thống kiểm tra nghiêm ngặt mỗi giao dịch trước khi thực thi để đảm bảo nó không dẫn đến deadlock. Nếu có ngay cả cơ hội nhỏ một giao dịch có thể dẫn đến deadlock, nó sẽ không bao giờ được cho phép thực thi.

Có một số lược đồ ngăn chặn deadlock sử dụng timestamp (dấu thời gian) để đảm bảo deadlock không xảy ra. Chúng là:

  • Lược đồ Wait - Die (Wait - Die Scheme)

    Trong lược đồ wait-die, nếu giao dịch T1 yêu cầu tài nguyên được giữ bởi giao dịch T2, một trong hai khả năng sau có thể xảy ra:

    • TS(T1) < TS(T2) - Nếu T1 lớn tuổi hơn T2 (T1 vào hệ thống sớm hơn T2), thì nó được phép chờ tài nguyên sẽ rảnh khi T2 hoàn thành thực thi.
    • TS(T1) > TS(T2) - Nếu T1 trẻ hơn T2 (T1 vào hệ thống sau T2), thì T1 bị kill (giết). Nó được khởi động lại sau với cùng timestamp.
  • Lược đồ Wound - Wait (Wound - Wait Scheme)

    Trong lược đồ wound-wait, nếu giao dịch T1 yêu cầu tài nguyên được giữ bởi giao dịch T2, một trong hai khả năng sau có thể xảy ra:

    • TS(T1) < TS(T2) - Nếu T1 lớn tuổi hơn T2, thì nó được phép roll back T2 hoặc wound T2. Sau đó T1 lấy tài nguyên và hoàn thành thực thi. T2 sau đó được khởi động lại với cùng timestamp.
    • TS(T1) > TS(T2) - Nếu T1 trẻ hơn T2, thì nó được phép chờ tài nguyên sẽ rảnh khi T2 hoàn thành thực thi.

Tránh Deadlock (Deadlock Avoidance)

Tốt hơn là tránh deadlock thay vì biện pháp sau khi deadlock đã xảy ra. Đồ thị chờ đợi (wait-for graph) có thể được dùng để tránh deadlock. Tuy nhiên, điều này chỉ hữu ích cho cơ sở dữ liệu nhỏ vì có thể trở nên khá phức tạp trong cơ sở dữ liệu lớn.

Đồ thị chờ đợi (Wait for graph)

Đồ thị chờ đợi hiển thị mối quan hệ giữa tài nguyên và giao dịch. Nếu một giao dịch yêu cầu tài nguyên hoặc nếu nó đã giữ tài nguyên, nó hiển thị dưới dạng cạnh (edge) trên đồ thị chờ đợi. Nếu đồ thị chờ đợi chứa chu trình (cycle), thì có thể có deadlock trong hệ thống, nếu không thì không.

Deadlock (Te nghẽn) trong DBMS

Bỏ qua Deadlock - Thuật toán Đà điểu (Ostrich Algorithm)

Thuật toán đà điểu (Ostrich algorithm) có nghĩa là deadlock đơn giản bị bỏ qua và giả định rằng nó sẽ không bao giờ xảy ra. Điều này được làm vì trong một số hệ thống chi phí xử lý deadlock cao hơn nhiều so với việc bỏ qua nó vì nó xảy ra rất hiếm. Vì vậy, đơn giản giả định deadlock không bao giờ xảy ra và khởi động lại hệ thống nếu nó xảy ra bằng bất kỳ cách nào.