Tôi đã đọc lại Herlihy và Wing nhiều lần trong 15 năm qua. Nó là một rất khó đọc. Và đó là điều không may, bởi vì trong khi có một số sự tinh tế xung quanh các cạnh, ý tưởng cơ bản thực sự khá hợp lý.
Nói tóm lại: tính tuyến tính giống như tính tuần tự, nhưng với yêu cầu bổ sung là việc tuần tự hóa tôn trọng các ràng buộc đặt hàng bổ sung giữa các giao dịch. Mục tiêu là cho phép bạn suy luận chặt chẽ về một cấu trúc dữ liệu nguyên tử riêng lẻ thay vì phải suy luận về toàn bộ hệ thống cùng một lúc.
Tính tuyến tính cũng dễ dàng đạt được: chỉ cần liên kết một mutex với đối tượng bạn muốn tuyến tính hóa. Mọi giao dịch trên đối tượng đó bắt đầu bằng cách khóa mutex và kết thúc bằng cách mở khóa mutex.
Dưới đây là các định nghĩa tôi sẽ sử dụng:
Một hệ thống là serializabile nếu được cung cấp một tập hợp các giao dịch trên một tập hợp dữ liệu, bất kỳ kết quả nào của việc thực hiện các giao dịch đều giống như khi các giao dịch được thực hiện theo một thứ tự tuần tự và các hoạt động trong mỗi giao dịch được chứa trong giao dịch của chúng theo thứ tự được chỉ định bởi mã của giao dịch.
Tính tuần tự không cho phép xuất hiện xen kẽ các hoạt động giữa các giao dịch khác nhau và yêu cầu thứ tự giao dịch được chọn thỏa mãn tính nhân quả (nếu giao dịch A ghi giá trị x và giao dịch B đọc giá trị x mà A đã viết, thì giao dịch A phải trước giao dịch B thứ tự nối tiếp được chọn.) Nhưng nó không nói gì về bất kỳ ràng buộc nào khác đối với việc đặt hàng giao dịch (đặc biệt, nó không nói gì về các quy trình và thứ tự xử lý các sự kiện.)
Có một ý tưởng liên quan khác bổ sung các ràng buộc về thứ tự xử lý các hoạt động được thực hiện (nhưng không nói về các giao dịch chỉ các hoạt động đọc / ghi riêng lẻ):
Một hệ thống phù hợp tuần tự nếu kết quả của bất kỳ thực thi nào giống như khi các hoạt động của tất cả các quy trình được thực hiện theo một thứ tự tuần tự và các hoạt động của từng quy trình riêng lẻ xuất hiện theo trình tự được chỉ định bởi chương trình của nó. ( Lamport, "Cách tạo ra một máy tính đa bộ xử lý chính xác các chương trình đa xử lý", IEEE T Comp 28: 9 (690-691), 1979 ).
Ẩn ý trong định nghĩa về tính nhất quán tuần tự là chúng tôi chỉ chấp nhận các thứ tự tuần tự trong đó đối với từng vị trí bộ nhớ (đối tượng), thứ tự tuần tự cảm ứng tuân theo quy tắc rằng giá trị được trả về của mỗi thao tác đọc đối với vị trí x
phải cùng giá trị được ghi bởi hoạt động ghi ngay trước đó đến vị trí x
theo thứ tự tuần tự.
Tính tuyến tính có ý định tốt (a) kết hợp cùng khái niệm giao dịch (từ tuần tự hóa) với khái niệm rằng các quy trình mong đợi các hoạt động mà chúng phát hành sẽ hoàn thành theo thứ tự (từ tính nhất quán tuần tự) và (b) thu hẹp các tiêu chí chính xác để nói về từng tiêu chí đối tượng trong sự cô lập, thay vì buộc bạn phải suy luận về toàn bộ hệ thống. (Tôi muốn có thể nói rằng việc triển khai đối tượng của tôi là chính xác ngay cả trong một hệ thống có các đối tượng khác không thể tuyến tính hóa.) Tôi tin rằng Herlihy và Wing có thể đã cố gắng xác định chặt chẽ một màn hình .
Phần (a) là "dễ dàng": Yêu cầu giống như tính nhất quán tuần tự sẽ là các giao dịch trên đối tượng được phát hành bởi mỗi quy trình xuất hiện trong chuỗi kết quả theo thứ tự được chỉ định bởi chương trình. Một yêu cầu giống như tuần tự hóa sẽ là các giao dịch trên đối tượng đều loại trừ lẫn nhau (có thể được tuần tự hóa).
Sự phức tạp đến từ mục tiêu (b) (có thể nói về từng đối tượng một cách độc lập với tất cả các đối tượng khác).
Trong một hệ thống có nhiều đối tượng, có thể các thao tác trên các đối tượng B ràng buộc theo thứ tự mà chúng tôi tin rằng các hoạt động được gọi trên đối tượng A. Nếu chúng tôi đang xem xét toàn bộ lịch sử hệ thống thì chúng tôi sẽ bị ràng buộc theo các lệnh tuần tự nhất định và sẽ cần phải từ chối người khác. Nhưng chúng tôi muốn có một tiêu chí chính xác mà chúng tôi có thể sử dụng một cách cô lập (lý do chỉ về những gì xảy ra với đối tượng A mà không hấp dẫn lịch sử hệ thống toàn cầu).
Ví dụ: giả sử tôi đang cố tranh luận về tính đúng đắn của đối tượng A, đó là một hàng đợi, giả sử đối tượng B là một vị trí bộ nhớ và giả sử tôi có các lịch sử thực hiện sau: Chủ đề 1: A.enqueue (x), A. dequeue () (trả về y). Chủ đề 2: A.enqueue (y), A.dequeue () (trả về x). Có sự xen kẽ các sự kiện sẽ cho phép thực hiện hàng đợi này là chính xác không? Đúng:
Thread 1 Thread 2
A.enqueue(x) ...
... A.enqueue(y)
... A.dequeue() (returns x)
A.dequeue(y) (returns y) ...
Nhưng bây giờ nếu lịch sử ( bao gồm cả đối tượng B ) là: B bắt đầu bằng giá trị 0. Chủ đề 1: A.enqueue (x), A.dequeue () (trả về y), B.write (1). Chủ đề 2: B.read () (trả về 1) A.enqueue (y), A.dequeue () (trả về x).
Thread 1 Thread 2
A.enqueue(x) ...
A.dequeue() (returns y) ... (uh oh!)
B.write(1) ...
... B.read() (returns 1)
... A.enqueue(y)
... A.dequeue() (returns x)
Bây giờ chúng tôi muốn định nghĩa về "tính chính xác" của chúng tôi để nói rằng lịch sử này chỉ ra rằng việc triển khai A của chúng tôi là lỗi hoặc việc triển khai B của chúng tôi là lỗi, bởi vì không có sự tuần tự hóa nào "có ý nghĩa" (Chủ đề 2 cần đọc một giá trị từ B chưa được viết hoặc Chủ đề 1 cần loại bỏ một giá trị từ A chưa được xử lý.) Vì vậy, trong khi việc xâu chuỗi ban đầu của chúng tôi về các giao dịch trên A có vẻ hợp lý, nếu việc triển khai của chúng tôi cho phép một lịch sử như lịch sử thứ hai, sau đó rõ ràng là không chính xác.
Vì vậy, các ràng buộc mà tuyến tính hóa thêm vào là khá hợp lý (và cần thiết ngay cả đối với các cấu trúc dữ liệu đơn giản như hàng đợi FIFO.) Chúng là những thứ như: "việc triển khai của bạn sẽ không cho phép dequeue () một giá trị sẽ không được xử lý () cho đến một lúc nào đó Tương lai." Khả năng tuyến tính khá dễ dàng (và tự nhiên) để đạt được: chỉ cần liên kết một mutex với đối tượng của bạn và mỗi giao dịch bắt đầu bằng cách khóa và kết thúc bằng cách mở khóa. Lý do về tính tuyến tính bắt đầu trở nên khó khăn khi bạn đang cố gắng thực hiện tính nguyên tử của mình bằng các kỹ thuật không chặn hoặc khóa hoặc không chờ đợi thay vì các đột biến đơn giản.
Nếu bạn quan tâm đến một số gợi ý về tài liệu, tôi đã tìm thấy những điều sau đây (mặc dù tôi nghĩ rằng cuộc thảo luận về "thời gian thực" là một trong những vấn đề khó khăn khiến tuyến tính trở nên khó khăn hơn mức cần thiết.) Https: // stackoverflow.com/questions/4179587/difference-b between-linearizability-and-serializability