2011-08-21 39 views
6

Sự khác biệt chính xác giữa các lược đồ đồng thời truyền thông điệp và các lược đồ đồng thời dựa trên khóa, về mặt hiệu suất là gì? Một chuỗi đang chờ trên một khối khóa, vì vậy các luồng khác có thể chạy. Kết quả là, tôi không thấy cách truyền thông điệp có thể nhanh hơn so với đồng thời dựa trên khóa.Tin nhắn vượt qua và khóa

Chỉnh sửa: Cụ thể, tôi đang thảo luận cách tiếp cận thông báo như trong Erlang, so với phương pháp chia sẻ dữ liệu sử dụng khóa (hoặc hoạt động nguyên tử).

+0

Có thể bạn chỉ cần mở rộng câu hỏi của mình? Chính xác bạn đang hỏi về điều gì? Một số ví dụ về trường hợp? Bởi vì câu trả lời 'thực' cho câu hỏi của bạn - giống như viết một cuốn sách :) - thực sự dài –

+2

Đây có phải là sự so sánh công bằng không? Không phải táo và cam này sao? –

+0

là câu hỏi này về việc so sánh luồng truyền thống và phương pháp tiếp cận giống như [SEDA] (http://en.wikipedia.org/wiki/Staged_event-driven_architecture)? nếu có, thì sự hiểu biết của tôi là việc chặn luồng liên quan đến chi phí hiệu năng đáng kể (hàng rào bộ nhớ và như vậy). Bạn có thể xem thảo luận: [Làm thế nào để cải thiện đáng kể hiệu suất của java?] (Http://programmers.stackexchange.com/questions/96994/how-to-significantly-improve-java-performance) – gnat

Trả lời

1

Sử dụng tính năng chuyển tin nhắn khi tất cả những gì bạn muốn làm là khóa sai. Trong những trường hợp đó, hãy sử dụng khóa. Tuy nhiên, việc truyền thông báo cho bạn nhiều điều hơn là chỉ khóa - như tên gọi của nó, nó cho phép bạn truyền các thông điệp, tức là dữ liệu, giữa các luồng hoặc các tiến trình.

1

Việc truyền tin nhắn (với các thông điệp không thay đổi) sẽ dễ dàng hơn để có được quyền. Với khóa và chia sẻ trạng thái có thể thay đổi, rất khó để tránh các lỗi đồng thời.

Đối với hiệu suất, tốt nhất bạn nên tự đo nó. Mỗi hệ thống khác nhau - các đặc tính tải công việc là các hoạt động phụ thuộc vào kết quả của các hoạt động khác hoặc chúng hoàn toàn hoặc độc lập (cho phép song song lớn), độ trễ hoặc thông lượng quan trọng hơn, bao nhiêu máy có vv. có thể nhanh hơn, hoặc sau đó một lần nữa thông điệp đi qua có thể, hoặc một cái gì đó hoàn toàn khác nhau. Nếu cách tiếp cận tương tự như trong LMAX phù hợp với vấn đề ở bàn tay, thì có thể điều đó có thể xảy ra. (Tôi sẽ phân loại kiến ​​trúc LMAX là thông điệp đi qua, mặc dù nó rất khác so với thông điệp dựa trên diễn viên.)

8

Như một số người khác đã đề xuất ("táo và cam"), tôi thấy hai kỹ thuật này là trực giao. Giả thiết cơ bản ở đây dường như là người ta sẽ chọn một hoặc cái khác: chúng ta sẽ sử dụng tài nguyên khóa và chia sẻ hoặc chúng ta sẽ sử dụng thông điệp đi qua. .

Giống như, nói, một bộ đánh giá metacircular, nó không rõ ràng đó là những nguyên thủy thực sự ở đây. Ví dụ: để triển khai gửi thư, có thể bạn sẽ cần số nguyên tử CAS và khả năng hiển thị bộ nhớ cụ thể hoặc có thể một số trạng thái khóa và chia sẻ. Người ta có thể thực hiện các hoạt động nguyên tử về khóa, hoặc người ta có thể thực hiện các khóa về các hoạt động nguyên tử (như Java thực hiện trong các loại java.util.concurrent.locks của nó).

Tương tự như vậy, mặc dù phải thừa nhận là một đoạn, người ta có thể triển khai khóa bằng thông điệp. Yêu cầu cái nào hoạt động tốt hơn không có ý nghĩa gì nói chung, bởi vì đó thực sự là một câu hỏi mà chúng được xây dựng theo đó. Nhiều khả năng, cái ở mức thấp hơn có thể được điều khiển tốt hơn bởi một lập trình viên có khả năng hơn là được xây dựng trên đầu trang — như trường hợp với hộp số tay truyền cho đến gần đây (cũng có một cuộc tranh luận ở đó).

Thông thường, cách tiếp cận thông điệp được khen ngợi không phải cho hiệu suất tốt hơn, mà là vì an toàn và tiện lợi, và thường được bán bằng cách từ chối kiểm soát lập trình khóa và tài nguyên được chia sẻ. Kết quả là, nó đặt cược chống lại khả năng lập trình; nếu các lập trình viên không thể có được một khóa, anh ta không thể làm điều đó kém và làm chậm chương trình xuống. Giống như một cuộc tranh luận liên quan đến quản lý bộ nhớ thủ công và thu gom rác thải, một số sẽ được coi là "trình điều khiển tốt", làm cho hầu hết các điều khiển bằng tay; những người khác — đặc biệt là những người thực hiện và thúc đẩy sử dụng một người thu gom rác — sẽ tuyên bố rằng trong tổng hợp, người thu thập có thể làm một công việc tốt hơn "trình điều khiển không tốt" có thể với quản lý thủ công.

Không có câu trả lời tuyệt đối. Sự khác biệt ở đây sẽ nằm ở mức độ kỹ năng của các lập trình viên, chứ không phải với các công cụ mà họ có thể sử dụng.

4

IMHO, Việc chuyển thư có thể không chính xác là một lược đồ đồng thời. Về cơ bản nó là một hình thức của (IPC) Inter Process Communication, một thay thế cho các đối tượng được chia sẻ. Erlang chỉ ủng hộ Thông điệp gửi đến các đối tượng được chia sẻ.

Nhược điểm của Shared Objects (Ưu od Message passing):

  • Tình trạng của Mutable đối tượng/Shared là khó khăn hơn để lý do về trong một bối cảnh mà nhiều luồng chạy đồng thời.
  • Đồng bộ hóa trên một đối tượng được chia sẻ sẽ dẫn đến các thuật toán vốn không phải là wait free hoặc không lock free.
  • Trong một hệ thống đa xử lý, Một đối tượng được chia sẻ có thể được nhân đôi trên bộ đệm bộ xử lý. Ngay cả với việc sử dụng các thuật toán So sánh và trao đổi dựa trên không yêu cầu đồng bộ hóa, có thể nhiều chu kỳ xử lý sẽ được dùng để gửi các thông điệp kết hợp bộ nhớ cache tới từng bộ xử lý.
  • Một hệ thống được xây dựng thông điệp ngữ nghĩa truyền đạt vốn có khả năng mở rộng hơn. Kể từ khi thông điệp đi qua ngụ ý rằng các tin nhắn được gửi không đồng bộ, người gửi không bắt buộc phải chặn cho đến khi người nhận hành động trên tin nhắn.

Ưu điểm của Shared Objects (Nhược điểm của tin nhắn Passing):

  • Một số thuật toán có xu hướng đơn giản hơn nhiều.
  • Hệ thống chuyển thư yêu cầu tài nguyên bị khóa cuối cùng sẽ biến thành hệ thống đối tượng được chia sẻ. Điều này đôi khi rõ ràng trong Erlang khi các lập trình viên bắt đầu sử dụng các bảng ets etc để lưu trữ trạng thái chia sẻ.
  • Nếu các thuật toán không có thời gian chờ, bạn sẽ thấy hiệu suất được cải thiện và giảm dung lượng bộ nhớ vì có ít sự phân bổ đối tượng hơn dưới dạng tin nhắn mới.
0

Tin nhắn Truyền không sử dụng bộ nhớ dùng chung, có nghĩa là nó không cần khóa, khiến mỗi luồng (quá trình) chỉ có thể tải hoặc lưu trữ bộ nhớ riêng của mình, cách giao tiếp với nhau là gửi & nhận tin nhắn.

Các vấn đề liên quan