2009-07-14 47 views
9

Cần sử dụng IPC để chuyển số lượng lớn dữ liệu (200kb +) từ tiến trình con sang cha mẹ trên OS X 10.4 trở lên, tôi đọc trên bộ nhớ dùng chung trên Unix, cụ thể là cơ chế bộ nhớ chia sẻ System V và POSIX. Sau đó, tôi nhận ra rằng mmap() có thể được sử dụng với các cờ MAP_ANON và MAP_SHARED để làm một điều tương tự (hoặc chỉ với cờ MAP_SHARED, nếu tôi không nhớ một tập tin thường xuyên được tạo ra).Tại sao sử dụng bộ nhớ chia sẻ SysV hoặc POSIX so với mmap()?

Câu hỏi của tôi là, có bất kỳ lý do nào không chỉ sử dụng mmap() không? Nó có vẻ đơn giản hơn nhiều, bộ nhớ vẫn được chia sẻ, và nó không phải tạo một tập tin thực nếu tôi sử dụng MAP_ANON. Tôi có thể tạo các tập tin trong quá trình cha mẹ sau đó fork() và exec() đứa trẻ và sử dụng nó trong quá trình con.

Phần thứ hai của câu hỏi là, lý do nào khiến phương pháp này không đủ, và ai sẽ phải sử dụng cơ chế bộ nhớ chia sẻ SysV hoặc POSIX? Lưu ý rằng tôi đã lên kế hoạch thực hiện đồng bộ bằng cách sử dụng các đường ống mà tôi cần cho giao tiếp khác, tức là cha mẹ yêu cầu dữ liệu qua đường ống, đứa trẻ viết nó vào bộ nhớ dùng chung và phản hồi trên đường ống sẵn sàng. Không có nhiều độc giả hoặc nhà văn tham gia. Tính di động không phải là ưu tiên.

Trả lời

8

Nếu bạn có mối quan hệ cha/con, bạn nên sử dụng mmap.

sysv_shm là triển khai unix gốc cho phép các quy trình liên quan và không liên quan chia sẻ bộ nhớ. posix_shm bộ nhớ dùng chung được chuẩn hóa.

Nếu bạn đang sử dụng hệ thống posix không có mmap, bạn nên sử dụng posix_shm. Nếu bạn đang ở trên một unix mà không có posix_shm bạn sẽ sử dụng sysv_shm. Nếu bạn chỉ cần chia sẻ bộ nhớ so với cha mẹ/con, bạn sẽ sử dụng mmap nếu có.

+0

Bạn không thể sử dụng posix_shm mà không có mmap, phần đó là vô nghĩa. Mặc dù vậy, bạn đã đúng trong đoạn đầu tiên, posix_shm cho phép mmap khi bạn không có mối quan hệ cha/con. –

0

Nếu bộ nhớ phục vụ, lý do duy nhất để sử dụng SysV/POSIX trên mmap là tính di động. Trong các hệ thống Unix đặc biệt cũ hơn không hỗ trợ MAP_ANON. Tuy nhiên, Solaris, Linux, BSD và OS X làm, do đó, trong thực tế, có rất ít lý do để không sử dụng mmap.

1

shm trong Linux thường được thực hiện thông qua một file /dev/shm mà được mmap PED, vì vậy, hiệu suất nên được tương đương - Tôi muốn đi với mmap (w/MAP_ANONMAP_SHARED như bạn đề cập) vì đơn giản, nếu tôi biết tính di động là không có vấn đề như bạn nói là trường hợp cho bạn.

0

Theo như các documentation biết, bạn phải sử dụng SYSV chia sẻ bộ nhớ nếu bạn muốn sử dụng Xlib/XCB hình ảnh chia sẻ bộ nhớ.

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