Ai cần tuyến tính?


13

Tôi đã đọc về sự khác biệt giữa tính tuần tựtính tuyến tính , cả hai đều là tiêu chí thống nhất cho các hệ thống được nhân rộng, chẳng hạn như cơ sở dữ liệu được nhân rộng. Tuy nhiên, tôi không biết trong trường hợp nào sẽ cần tính tuyến tính, mặc dù nó mạnh hơn tính tuần tự.

Bạn có thể đưa ra các kịch bản mà tài sản mạnh như vậy sẽ thực sự cần thiết?


Bạn có thể kiểm tra trên wikipedia: en.wikipedia.org/wiki/ , hoặc trên tờ giấy của Herlihy và Wing: "Tính tuyến tính: Một điều kiện chính xác cho các đối tượng đồng thời".
Eduardo Bezerra

Câu trả lời:


5

Xem xét việc thiết kế các cấu trúc dữ liệu đồng thời, chờ đợi (hoặc không khóa, yếu hơn). Trong kịch bản này, tính tuyến tính thường được yêu cầu, mặc dù trong một số trường hợp, hiệu suất và khả năng mở rộng có thể được cải thiện bằng cách đáp ứng điều kiện chính xác yếu hơn. Việc triển khai có đáp ứng điều kiện yếu như vậy có hữu ích hay không thường phụ thuộc vào ứng dụng. Ngược lại, một triển khai tuyến tính hóa luôn luôn có thể sử dụng được, bởi vì các nhà thiết kế có thể xem nó như là nguyên tử.

Hơn nữa, tính tuyến tính là một thuộc tính không chặn: một hoạt động tổng thể (được xác định cho tất cả các trạng thái đối tượng) không bao giờ được yêu cầu để chặn. Thay vào đó, tính tuần tự không phải là một thuộc tính không chặn. Do đó, để tăng mức độ đồng thời, các nhà thiết kế cấu trúc dữ liệu đồng thời luôn dựa vào tính tuyến tính.


1
Đây không phải là một câu trả lời hay, vì nó sử dụng một khái niệm không giải thích được khác để giải thích khái niệm này trong sự nghi ngờ .. (đọc đây là một sự lãng phí thời gian) .. các câu trả lời dưới đây tốt hơn nhiều ...
Richard

Có vẻ như bạn không đọc câu hỏi OP ban đầu. OP không hỏi tính tuyến tính là gì, anh ta hỏi "Ai cần tuyến tính hóa"? Câu trả lời của tôi là phù hợp, vì nó cung cấp cho OP một kịch bản ví dụ (ít nhất, nó được coi là phù hợp và được OP chọn). Việc bạn không biết cấu trúc dữ liệu chờ, đồng thời là gì là một vấn đề hoàn toàn khác. Nhân tiện, OP biết tôi đang nói về cái gì. Nếu chúng tôi phải giải thích mọi khái niệm chúng tôi sử dụng trong câu trả lời, câu trả lời sẽ không bao giờ chấm dứt ;-)
Massimo Cafaro

10

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í xphải cùng giá trị được ghi bởi hoạt động ghi ngay trước đó đến vị trí xtheo 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


Ý bạn là gì khi tuyên bố rằng `` 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. ' Bạn có thể vui lòng thêm một số chi tiết. (Tôi đang đọc bài báo của Herlihy và Wing.)
hengxin 17/12/13

1
Tôi không nghĩ tôi có ý gì sâu sắc. Trước khi tôi đọc Herlihy và Wing, những điều tôi đã đọc về màn hình đều hoạt động. Một cái gì đó như "màn hình là một kiểu dữ liệu trừu tượng, hoàn toàn có một mutex và mọi phương thức của kiểu này đều thu được mutex ở đầu và giải phóng mutex ở cuối", sau đó là một cuộc thảo luận phức tạp về việc khi nào nó ổn wait()notify(). Tính tuyến tính cho một cách nói về tính chính xác của việc triển khai màn hình phức tạp / tối ưu hóa hơn nhiều.
Logic lang thang

Nó có ý nghĩa với tôi. Cám ơn. Hôm nay tôi đã đọc Related Workmột phần của bài báo Herlihy và Wing. Họ đã đề cập monitornhư một minh họa cho tuyên bố của họ rằng Our notion of linearizability generalizes and unifies similar notions found in specific examples in the literature. Tuy nhiên, một câu hỏi chung: liệu khái niệm về tính tuyến tính có được áp dụng rộng rãi trong các hệ thống đa bộ xử lý (ví dụ: phần cứng, trình biên dịch, ngôn ngữ lập trình và cấu trúc dữ liệu đồng thời) không? (Bị cận thị, tôi chỉ biết những thứ như màn hình.) Nếu không, những trở ngại là gì? Nhà nước của nghệ thuật là gì?
hengxin

Tôi nghĩ rằng nó được coi là một tài sản mong muốn đôi khi quá đắt để thực thi. Xem ví dụ: khóa học.csail.mit.edu/6.852/01 / con / p91-patiya.pdf . Ngoài ra trong thực tế tôi nghĩ rằng hầu hết các hashtag đồng thời có một khóa trên mỗi nhóm, nhưng không có khóa toàn cầu và do đó có thể có hành vi lạ bất cứ khi nào việc chèn / xóa khiến bảng băm bị thay đổi kích thước.
Logic lang thang

Cảm ơn câu trả lời dài, nhưng tôi sợ rằng bạn đã không cho tôi biết khi nào tính tuyến tính là thú vị, mà chỉ xác định nó và, về vấn đề đó, bạn đã xác định sai: không đủ để mỗi quy trình nhìn thấy các hoạt động trong lệnh họ đã được ban hành. Thứ tự trên tất cả các quy trình cũng phải nhất quán. Nhưng hãy sửa tôi nếu tôi sai ...
Eduardo Bezerra

2

Đầu tiên, tính tuyến tính và tính tuần tự không thể so sánh trực tiếp. Như bảng dưới đây cho thấy, sự khác biệt chính là ở phía bên trái, tất cả các hoạt động riêng lẻ là nguyên tử (giống như có java synchronizedxung quanh mỗi op. Ở bên phải, đơn vị nguyên tử là một giao dịch, một hoạt động riêng lẻ không phải là nguyên tử Đó là lý do tại sao tính tuần tự luôn là một phần của tài liệu cơ sở dữ liệu, trong khi phía bên trái là chủ đề của tài liệu bộ nhớ bộ xử lý (đọc / ghi op là nguyên tử). Các kho lưu trữ khóa-giá trị ban đầu (như dbm và memcached) bắt đầu ở phía bên tay trái (get / put là nguyên tử), nhưng những cái mới hơn đang ngày càng hỗ trợ các giao dịch (chẳng hạn như cờ lê của Google).

obj. hoạt động là nguyên tử | Giao dịch là nguyên tử
-------------------------------- + ----------------- ----------------
Tính tuyến tính |
Tính nhất quán tuần tự | Tính tuần tự
Tính nhất quán nhân quả |
Tính nhất quán của bộ nhớ cache |

Tính tuyến tính yêu cầu một hệ thống các đối tượng trong một thiết lập đồng thời phải hoạt động giống hệt với một hệ thống tuần tự xử lý một hoạt động (một cặp yêu cầu / phản hồi) tại một thời điểm - trong một vũ trụ song song - theo cách mà (a) các máy khách trong cả hai vũ trụ đều thấy chính xác các phản ứng giống nhau (b) trật tự thời gian được bảo tồn (nhiều hơn về điều này dưới đây).

Định nghĩa về tính tuần tự, như tính nhất quán tuần tự, chỉ yêu cầu tiêu chí đầu tiên.

Bảo toàn thứ tự tạm thời có nghĩa là: nếu A: x.op1 () (A là khách hàng, x là một đối tượng và op1 là một hoạt động) kết thúc trước khi một hoạt động khác B: y.op2 () bắt đầu, sau đó trong vũ trụ tuần tự yêu cầu được xử lý theo cùng một thứ tự. Điều này không bắt buộc trong Tính nhất quán tuần tự (SC); đối tượng được phép xếp hàng yêu cầu của khách hàng, trả lời khách hàng, sau đó đánh giá nó sau. Hơn nữa, đối tượng có thể xử lý một yêu cầu sau đó từ một số khách hàng khác, lần lượt đánh giá nó trước khi đến yêu cầu đầu tiên.

Không bảo tồn trật tự thời gian là một vấn đề. Sau A: x.op1 (), giả sử A nhấc điện thoại và nói với B về nó, sau đó B gọi x.op2 () gọi. Không có cách nào để hệ thống biết về chuỗi sự kiện nhân quả này, vì bước thứ hai liên quan đến một thông điệp không được hệ thống theo dõi. Trong nhiều trường hợp thực tế, không phải là không có lý khi A cho rằng một khi x đã trả lời nó, thì lời mời của B có thể dựa vào trạng thái cập nhật. Nếu trật tự thời gian không được bảo tồn, A và B sẽ gây bất ngờ. Điều này sẽ không xảy ra trong một hệ thống tuyến tính hóa.

Thuộc tính tốt thứ hai của bảo toàn trật tự thời gian là tính cục bộ và thành phần, rằng một hệ thống được xây dựng từ các đối tượng tuyến tính hóa chính nó là tuyến tính hóa. Vì vậy, thay vì có một kho lưu trữ khóa-giá trị nguyên khối, bạn có thể chia nó thành nhiều phân vùng riêng biệt, mỗi phân vùng được quản lý bởi máy chủ lưu trữ KV của chính nó; nếu mỗi trong số chúng là tuyến tính hóa, toàn bộ cơ sở dữ liệu hoạt động như một cửa hàng KV nguyên khối tuyến tính hóa, không cần nỗ lực thêm.

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.