Làm thế nào để thiết kế cấu trúc dữ liệu đồng thời?


8

Trước đây tôi đã hỏi câu hỏi này trên Lập trình viên . Không thành công.

Tôi đang tìm kiếm tài nguyên học tập bằng văn bản về cách thiết kế cấu trúc dữ liệu đồng thời. Tôi quan tâm nhiều hơn đến quá trình thiết kế (ví dụ: xác định các bất biến đúng) so với sản phẩm cuối cùng (danh sách mã đầy đủ).

Lấy một ví dụ cụ thể: Tôi thực sự rất thích cuốn sách của Chris Okasaki, Cấu trúc dữ liệu chức năng thuần túy, bởi vì nó không chỉ là một tài liệu tham khảo - nó hướng dẫn người đọc thông qua việc thiết kế các cấu trúc dữ liệu và thuật toán của nó. Thông thường, cuốn sách thúc đẩy một thiết kế phức tạp hoặc không rõ ràng bằng cách trước tiên đưa ra một phiên bản ngây thơ hơn, và chỉ sau đó tinh chỉnh nó cho đến khi đạt được độ phức tạp thời gian mong muốn (trường hợp xấu nhất hoặc được khấu hao). Đây là loại điều tôi đang tìm kiếm.

Vì thế:

  1. Những kỹ thuật hoặc heuristic tồn tại để thiết kế cấu trúc dữ liệu đồng thời?

  2. Có bất kỳ cuốn sách, giấy tờ, bài đăng blog, hướng dẫn, vv giải thích các kỹ thuật và heuristic?

Câu trả lời:


5

Trong khi tôi chưa đọc sâu về lĩnh vực này, tôi thấy Nghệ thuật lập trình đa xử lý của Maurice Herlihy và Nir Shavit là một giới thiệu và khảo sát hữu ích về các kỹ thuật. Nó khám phá các thuật toán khác nhau, lý do về cách chúng hoạt động và kiểm tra sự đánh đổi, tính năng và hạn chế của các phương pháp khác nhau. Mặc dù nó có một số hình thức, tôi hy vọng nó là một văn bản khá giới thiệu và dễ tiếp cận.

Đối với một hương vị của văn bản, đây là phần giới thiệu về phần Đăng ký nguyên tử từ phiên bản 2008:

Nơi rõ ràng để bắt đầu là hỏi liệu chúng ta có thể giải quyết sự đồng thuận bằng cách sử dụng các thanh ghi nguyên tử hay không. Đáng ngạc nhiên, có lẽ, câu trả lời là không. Chúng tôi sẽ chỉ ra rằng không có giao thức đồng thuận nhị phân cho hai luồng. Chúng tôi để nó như một bài tập để chỉ ra rằng nếu hai luồng không thể đạt được sự đồng thuận về hai giá trị, thì các nluồng không thể đạt được sự đồng thuận về kcác giá trị, ở đâu n > 2k > 2.


Tôi không sợ hình thức! :-)
pyon

3

Câu trả lời không đơn giản như lập trình chức năng. Trong lập trình chức năng ở đây, chúng ta có một khái niệm chung về lập trình chức năng là gì và bản thân đặc tả cấu trúc dữ liệu không thay đổi bởi thực tế là chúng có chức năng. Tuy nhiên, đó không phải là trường hợp đồng thời:

  1. Có nhiều mô hình tính toán phân tán / song song / đồng thời.

  2. Không có một sự chuyển biến chung cho các đặc điểm kỹ thuật của một cấu trúc dữ liệu tuần tự mang đến cho bạn những đặc điểm kỹ thuật của phiên bản đồng thời của nó. Có điều kiện khác nhau (thường phân loại theo an toànliveness điều kiện) mà chúng ta có thể yêu cầu từ một phiên bản đồng thời của một cấu trúc dữ liệu, có những kết quả khác nhau mới (ví dụ như các hoạt động tạm dừng, các hoạt động hủy, tai nạn, vv). Vì vậy, có thể có nhiều thông số kỹ thuật khác nhau cho các phiên bản đồng thời của cấu trúc dữ liệu tuần tự.

Một số câu hỏi về tài liệu tham khảo về điện toán phân tán:

Xem thêm Tại sao chúng ta không thể phát triển một lý thuyết phức tạp thống nhất về điện toán phân tán?


1

Nguyên tắc đầu tiên của cấu trúc dữ liệu đồng thời là: Bạn không muốn đồng thời.

Trong trường hợp lý tưởng, tính toán phân tán / song song / đồng thời có nghĩa là bạn có một số quy trình tuần tự hoàn toàn độc lập. Mỗi quy trình có dữ liệu và tài nguyên riêng và quy trình thậm chí không nhận thấy bất kỳ quy trình nào khác.

Trong trường hợp xấu nhất, bạn có một hệ thống bộ nhớ dùng chung với nhiều luồng truy vấn và cập nhật cùng một cấu trúc dữ liệu. Một cái gì đó có lẽ đã đi sai lầm khủng khiếp, nếu bạn nghiêm túc xem xét điều này.

Tất nhiên, khi chúng ta đang nói về cấu trúc dữ liệu đồng thời, một số mức độ đồng thời là không thể tránh khỏi. Chúng tôi vẫn muốn giảm thiểu nó. Quá trình càng dài có thể hoạt động tuần tự mà không cần chạm vào các trường hợp đột biến, thực hiện các hoạt động nguyên tử hoặc gửi tin nhắn, mọi khả năng mọi thứ đều hoạt động chính xác và hiệu suất có thể chấp nhận được.

Cấu trúc dữ liệu tĩnh với các cập nhật hàng loạt yêu cầu ít đồng bộ hóa hơn cấu trúc dữ liệu động. Bạn nên cố gắng làm cho cấu trúc dữ liệu đồng thời của mình tĩnh hoặc ít nhất là càng gần tĩnh càng tốt. Nếu thuật toán của bạn yêu cầu các truy vấn xen kẽ với các bản cập nhật, hãy thử thay đổi thuật toán trước khi sử dụng các cấu trúc động được chia sẻ.

Nguyên tắc thiết kế tương tự cũng được áp dụng để cập nhật cấu trúc dữ liệu tĩnh. Bạn càng độc lập có thể làm cho các quá trình cập nhật cấu trúc, mọi thứ hoạt động tốt hơn.


Bạn có ý nghĩa gì bởi các cấu trúc dữ liệu tĩnh
pyon

@ EduardoLeón Các cấu trúc có thể được truy vấn nhưng không được cập nhật hiệu quả, ví dụ như các mảng được sắp xếp thay vì các cây tìm kiếm. Là một lợi ích bổ sung, các cấu trúc tĩnh có xu hướng nhỏ hơn và nhanh hơn các cấu trúc động.
Jouni Sirén
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.