2011-03-03 44 views
5

Tôi có một ứng dụng hệ thống, chạy như một bộ sưu tập trên 12 quy trình trên Unix. Có một quá trình giám sát, trao đổi dữ liệu từ với 11 quy trình khác.IPC nào hiệu quả hơn ở đây?

Yêu cầu IPC là làm cho 11 quy trình này liên lạc với quy trình giám sát, được thiết kế theo cách hiệu quả nhất về mặt thực thi. Các bạn có thể cân nhắc hai lựa chọn dưới đây hoặc đề xuất một tùy chọn tốt hơn không.

1) có giao tiếp ổ cắm UDP, trong đó 11 quy trình này sẽ đẩy dữ liệu đến quy trình giám sát trong khoảng thời gian định kỳ. quá trình theo dõi chỉ là nghe và thu thập thông tin đủ tốt.

HOẶC

2) có một bộ nhớ dùng chung. do đó, có 11 phân đoạn bộ nhớ chia sẻ, trong đó mỗi phân đoạn được chia sẻ giữa 2 quy trình (quá trình xử lý và quá trình giám sát).

Đối với bộ nhớ dùng chung, có vẻ nhanh hơn nhưng có yêu cầu khóa/đồng bộ, trong khi udp hạt nhân sao chép dữ liệu từ không gian bộ nhớ của quy trình này sang tiến trình khác.

Bất kỳ ai cũng có thể cung cấp thêm đầu vào để giúp đánh giá tốt hơn hai phương pháp. ? Cảm ơn.

+3

Bạn thực sự có nghĩa là ổ cắm UDP, hoặc bạn có nghĩa là ổ cắm miền Unix? –

Trả lời

5

Điều phối bộ nhớ dùng chung là khó khăn. Phụ huynh phải biết khi nào đọc phần nào của mỗi phân đoạn bộ nhớ chia sẻ 11, và để cho đứa trẻ biết khi nào dữ liệu đã được đọc sao cho một phần của bộ nhớ dùng chung có thể được tái sử dụng, v.v. nhanh hơn, phần còn lại của phối hợp (có thể sử dụng bộ semaphore - có thể với 22 semaphores, một cho mỗi hướng trong 11 kênh truyền thông) có nghĩa là bạn gần như chắc chắn sẽ tìm thấy một cơ chế dựa trên mô tả tập tin dễ dàng hơn nhiều để viết mã. Các cuộc gọi hệ thống select() hoặc poll() hoặc biến thể có thể được sử dụng để cho bạn biết khi nào có dữ liệu để tổng thể đọc. Và hạt nhân giao dịch với tất cả các vấn đề khó chịu về lập kế hoạch và kiểm soát luồng và vân vân.

Vì vậy, hãy sử dụng các ổ cắm miền Unix trừ khi bạn thực sự có thể chứng minh rằng bạn sẽ nhận được lợi ích hiệu suất từ ​​phiên bản bộ nhớ dùng chung. Nhưng mong đợi để mất một số sợi lông (và một số dữ liệu) nhận được việc thực hiện bộ nhớ chia sẻ chính xác. (Bạn có thể chứng minh rằng có lợi ích hiệu năng khi sử dụng bộ nhớ chia sẻ với hệ thống thô, không đúng cách, bạn có thể sẽ không được đưa vào sản xuất với hệ thống đồng bộ hóa không đúng.)

2

Nó phụ thuộc rất nhiều vào số lượng dữ liệu mà các quá trình cần chia sẻ với nhau. Nếu nó sẽ có nhiều dữ liệu (ví dụ: megabyte hoặc gigabyte) được truyền qua lại thì bộ nhớ dùng chung sẽ là cách hiệu quả hơn. Nếu chỉ có một lượng dữ liệu tương đối nhỏ (kilobyte hoặc có thể là vài megabyte) thì cách tiếp cận dựa trên ổ cắm có thể thích hợp hơn, vì hiệu quả sẽ không quan trọng lắm và tránh bộ nhớ dùng chung sẽ làm cho hệ thống của bạn mạnh mẽ hơn dễ phát triển và gỡ lỗi hơn. Ngoài ra, một số hạt nhân hỗ trợ mạng không sao chép, trong trường hợp gửi gói UDP từ tiến trình này sang tiến trình khác có thể không yêu cầu hạt nhân sao chép dữ liệu, thay vào đó, nó chỉ remaps các trang MMU bên dưới vào quá trình đích . Nếu đó là trường hợp, phương pháp tiếp cận ổ cắm sẽ cung cấp cho bạn tốt nhất của cả hai thế giới (hiệu quả và mạnh mẽ).

+1

1) Dữ liệu sẽ theo thứ tự của avg: 30 kb/phút (trường hợp tải khoảng 60 kb/phút).2) dễ dàng của mã không phải là một mối quan tâm như chúng tôi có thời gian và công sức trong tầm tay để làm cho nó hiệu quả nhất theo định hướng. – sbr

+2

60 kilobyte/phút là một tải không đáng kể cho một máy tính hiện đại (ngay cả đối với một máy tính nhúng hiện đại). Nếu tải của bạn thực sự thấp, nó hầu như không quan trọng cách bạn thực hiện mọi thứ; bạn sẽ có được hiệu suất tốt với bất kỳ cơ chế hợp lý nào. Tôi sẽ không dành quá nhiều giờ lập trình trên một cơ chế phức tạp khi lợi ích duy nhất sẽ là bạn có thể thấy 0,01% sử dụng CPU thay vì 0,02%. Nếu đó là tôi, tôi sẽ chỉ sử dụng các ổ cắm TCP (hoặc UNIX). –

1

Trong phân phối UDP không được đảm bảo và có những lúc các gói bị loại bỏ ngay cả trong giao tiếp cục bộ. Vì vậy, MMF có lẽ sẽ tốt hơn.

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