2010-02-18 36 views
9

Tôi đã đọc rất nhiều bài viết về sự khác biệt giữa hàng đợi tin nhắn và bộ nhớ dùng chung. Nhưng vẫn chưa rõ cái nào là tốt để đạt được hiệu suất tốt.sự khác biệt giữa hàng đợi tin nhắn và bộ nhớ dùng chung?

Giống như bộ nhớ dùng chung được giả sử là tốt hơn hàng đợi nhưng cũng có vấn đề về hiệu năng trong trường hợp đồng bộ hóa.

+0

Duplicate http://stackoverflow.com/questions/2275909/whats-the-advantage-of-queues-over-pipes-when-communicating-between-processes/2276157#2276157 – t0mm13b

+0

Không bị lừa. Một là về ống, một là về shm. – kennytm

Trả lời

1

Hàng đợi tin nhắn có chi phí đồng bộ hóa vốn có, đảm bảo an toàn với chi phí hiệu suất. Bộ nhớ chia sẻ không có biện pháp bảo vệ - nếu hai chủ đề truy cập đồng thời, chúng có thể xung đột (ghi dữ liệu không phù hợp) trừ khi bạn đảm bảo an toàn luồng cho chính mình. Điều này có thể không đáng kể trong trường hợp các lỗi nhỏ được cho phép (nói, dữ liệu đi tới đầu ra analog và một số nhiễu có thể chấp nhận được), vì vậy bạn có thể bỏ qua kiểm tra lỗi hoàn toàn, và đi cùng với cách tiếp cận "đủ tốt" ở hiệu suất khá cao. Ngoài ra, bộ nhớ chia sẻ cho phép trao đổi các mẩu dữ liệu lớn và lưu trữ dữ liệu chung và liên tục cho một số ứng dụng tiết kiệm bộ nhớ. Hàng đợi tin nhắn dành cho thông lượng thấp hơn - bạn có thể sử dụng chúng để bảo vệ quyền truy cập vào bộ nhớ dùng chung.

29

Có thể sử dụng cả hàng đợi tin nhắn và bộ nhớ dùng chung để trao đổi thông tin giữa các quá trình. Sự khác biệt là ở cách chúng được sử dụng.

Bộ nhớ dùng chung là chính xác những gì bạn nghĩ: đó là khu vực lưu trữ có thể đọc và viết bởi nhiều quá trình. Nó không cung cấp đồng bộ hóa vốn có; nói cách khác, đó là lập trình viên để đảm bảo rằng một quá trình không che giấu dữ liệu của người khác. Nhưng nó hiệu quả về mặt thông lượng: đọc và viết là các hoạt động tương đối nhanh.

A hàng đợi tin nhắn là đường ống một chiều: một quy trình ghi vào hàng đợi và một lần đọc dữ liệu theo thứ tự được ghi cho đến khi điều kiện cuối dữ liệu xảy ra. Khi hàng đợi được tạo, kích thước tin nhắn (byte cho mỗi tin nhắn, thường là khá nhỏ) và độ dài hàng đợi (số lượng tin nhắn đang chờ xử lý tối đa) được thiết lập. Quyền truy cập chậm hơn bộ nhớ dùng chung vì mỗi thao tác đọc/ghi thường là một thông báo đơn. Nhưng hàng đợi đảm bảo rằng mỗi hoạt động sẽ xử lý toàn bộ một thông báo thành công hoặc thất bại mà không làm thay đổi hàng đợi. Vì vậy, các nhà văn không bao giờ có thể thất bại sau khi viết chỉ một phần tin nhắn, và người đọc sẽ hoặc là lấy một tin nhắn hoàn chỉnh hoặc không có gì cả.

+0

Ya, điểm tốt.Cảm ơn. – khushi

+0

+1 cho tôi. Tôi thấy văn bản này rất hữu ích. – gotqn

2

Khi sử dụng bộ nhớ dùng chung để xem xét các điều kiện chủng tộc có thể xảy ra khi một quy trình ghi vào đó và một quy trình khác đọc từ đó, điều cần lưu ý. Có một nguy cơ liên quan đến việc sử dụng trước đây, giả sử hai quá trình đang sử dụng nó, một để viết cho nó, một để đọc từ nó, một trong đó là viết chết do điều kiện bất thường, quá trình đọc nó có thể treo hoặc sụp đổ.

Bộ nhớ chia sẻ có thể được coi là nhanh hơn (chi phí thấp, khối lượng lớn dữ liệu được truyền) sau đó xếp hàng. Nhưng hàng đợi, mặt khác, đòi hỏi chi phí cao (thiết lập để thực hiện một hàng đợi để được vĩnh viễn vv) với khối lượng dữ liệu thấp.

Onus có bộ nhớ dùng chung là bạn phải triển khai đồng bộ hóa để làm chủ đề an toàn. Hãy xem bài viết tuyệt vời của Beej trên IPC.

Khi sử dụng Hàng đợi, chúng an toàn và không đơn độc, thư được giữ trong hàng đợi bất kể kết quả, giả sử hai quy trình đang sử dụng hàng đợi, khi một quá trình ghi vào hàng đợi (theo dạng tin nhắn) và quá trình khác sắp đọc từ nó bị chết hoặc bị chết do tai nạn hoặc tình trạng bất thường trong một hoàn cảnh như vậy, thông điệp đó vẫn còn đúng chỗ, quá trình khác nếu khởi động lại có thể đọc từ hàng đợi, tức là không có dữ liệu bị mất.

Đó là sự khác biệt giữa hai loại.

Hy vọng điều này sẽ giúp, Trân trọng, Tom.

+0

Cảm ơn bài viết đó (beej). thực sự gud một. – khushi

0

Hàng đợi tin nhắn và bộ nhớ dùng chung được sử dụng để chia sẻ dữ liệu giữa 2 quy trình. Hàng đợi tin nhắn yêu cầu dữ liệu được chia sẻ ở định dạng cụ thể. Cả hai quy trình phải đồng ý về điều này và chia sẻ các tin nhắn. Kernel cho phép chúng ta đọc toàn bộ tin nhắn hoặc đọc không có gì cho hàng đợi tin nhắn. Nhưng bộ nhớ dùng chung đòi hỏi một phần của phân đoạn được chia sẻ giữa 2 quy trình, cả hai có thể thực hiện một số kỹ thuật đồng bộ hóa và chia sẻ dữ liệu giữa các quy trình. Vì không cần sao chép dữ liệu để chia sẻ với quá trình khác, bộ nhớ dùng chung sẽ nhanh hơn.

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