Trạng thái không nhất quán của khóa


7

Tôi đang đọc Nghệ thuật lập trình đa bộ xử lý và cố gắng hiểu khái niệm về khóa không nhất quán của họ. Cụ thể, ở trang 37 , định nghĩa 2.8.1 của khóa không nhất quán đối với tôi không rõ ràng, cũng như Bổ đề 2.8.1.

Định nghĩa 2.8.1. Trạng thái đối tượng Khóa không nhất quán ở bất kỳ trạng thái toàn cầu nào có một số luồng nằm trong phần quan trọng, nhưng trạng thái khóa tương thích với trạng thái toàn cầu trong đó không có luồng nào ở phần quan trọng hoặc đang cố gắng nhập.

Bổ đề 2.8.1 Không có triển khai Khóa không có bế tắc có thể vào trạng thái không nhất quán.

Bằng chứng:

Giả sử đối tượng Khóa ở trạng thái không nhất quán s, trong đó không có luồng nào trong phần quan trọng hoặc cố gắng nhập. Nếu luồng B cố gắng vào phần quan trọng, cuối cùng nó phải thành công, vì việc thực hiện là không có bế tắc.

Giả sử đối tượng Khóa ở trạng thái không nhất quán s, trong đó A nằm trong phần quan trọng. Nếu luồng B cố gắng vào phần quan trọng, nó phải chặn cho đến khi A rời khỏi. Chúng tôi có một mâu thuẫn, bởi vì B không thể xác định liệu A có nằm trong phần quan trọng hay không.

Những gì tôi không hiểu:

  • Có phải không nhất quán chỉ có nghĩa là nếu một chủ đề nằm trong một phần quan trọng, không có cách nào các chủ đề khác có thể biết về nó?
  • Những gì mâu thuẫn trong một bằng chứng bổ đề? Nói chủ đề A ở trong một phần quan trọng và khóa ở trạng thái không nhất quán. Điều gì ngăn một chủ đề khác ghi đè lên trạng thái của khóa và có được nó?

bạn có thể nói rõ về "bế tắc miễn phí" của họ không?
vzn

Câu trả lời:


1
  • "Không nhất quán" ở đây có nghĩa là về cơ bản việc triển khai nội bộ không phản ánh đúng thực tế của việc kích hoạt luồng và khóa khả dụng. aka "khiếm khuyết". tức là nó không hoạt động chính xác như một khóa chủ đề. ví dụ: khóa có thể cho biết "đang hoạt động" nhưng không có luồng nào có được khóa hoặc khóa cho biết "không hoạt động" nhưng một số luồng có được khóa.

  • mâu thuẫn là theo "bế tắc miễn phí", cuối cùng một khóa sẽ được lấy bởi ít nhất một số luồng yêu cầu. nhưng nếu nó ở trạng thái không nhất quán thì một số luồng đang chạy nhưng khóa cho biết không có gì bị khóa. nhưng sau đó, bất kỳ luồng mới nào cũng không thể thành công trong việc lấy khóa (mà không chạy cùng lúc với A).

lưu ý một nếp nhăn / sự tinh tế từ một giới thiệu trực tuyến [1] phù hợp chặt chẽ với giải trình sách (cùng tác giả):

Lưu ý rằng một chương trình vẫn có thể bế tắc ngay cả khi mỗi khóa nó sử dụng thuộc tính không có bế tắc. Ví dụ: xem xét các chủ đề A và B chia sẻ khóa 0 và 1. Đầu tiên, A mua lại 0 và B mua lại 1. Tiếp theo, A cố gắng để có được 1 và B cố gắng để có được 0. Các chủ đề sẽ bế tắc vì mỗi người chờ đợi nhau phát hành khóa của nó

[1] Đồng bộ hóa đa cấu trúc và cấu trúc dữ liệu đồng thời Maurice Herlihy / Nir Shavit


"(không chạy cùng lúc với A)": phần nào trong các định nghĩa loại trừ điều này? Như Q gợi ý: Cho B khóa, để chúng chạy đồng thời. Không có lý do này phải dẫn đến bế tắc.
Patrick

Thành thật mà nói, khi kiểm tra kỹ hơn bằng chứng của họ nghe có vẻ hơi tròn đối với tôi nhưng nó có thể hoạt động đối với một số định nghĩa về "bế tắc miễn phí" (nhưng có lẽ không phải là đặc biệt của họ có vẻ hơi thiếu chính xác / mơ hồ).
vzn
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.