2010-02-14 52 views
22

Đã học được một chút về chủ đề, bất kỳ ai có thể nói, sự khác biệt thực sự giữa bộ nhớ chia sẻ POSIX (shm_open) và tệp ánh xạ POSIX (mmap) là gì?Posix được chia sẻ bộ nhớ so với các tệp được ánh xạ

Cả hai dường như đều sử dụng hệ thống con/dev/tmpfs, thay vào đó là cơ chế IPC cũ hơn.

Vì vậy, có lợi thế nào khi sử dụng tệp mmap trên bộ nhớ dùng chung không?

Cảm ơn.

Trả lời

2

Sự hiểu biết của tôi là bộ nhớ dùng chung được xây dựng trên các tệp được ánh xạ, nhưng This Page dường như chỉ ra rằng khả năng sử dụng các tệp ánh xạ bộ nhớ dưới dạng bộ nhớ dùng chung là có điều kiện.

Việc sử dụng hàm mmap() bị giới hạn bởi Giá trị hệ thống QSHRMEMCTL. Khi giá trị hệ thống này là 0, hàm mmap() có thể không tạo ra một ánh xạ được chia sẻ có khả năng PROT_WRITE. Về cơ bản, điều này ngăn cản việc tạo ra một bản đồ bộ nhớ có thể thay đổi nội dung của tệp luồng đang được ánh xạ. Nếu tham số cờ chỉ ra MAP_SHARED, tham số prot xác định PROT_WRITE và giá trị hệ thống QSHRMEMCTL là 0, thì hàm mmap() sẽ thất bại và số lỗi của kết quả EACCES.

+2

Chắc chắn QSHRMEMCTL là iSeries cụ thể. Ví dụ: không có đề cập đến nó trong http://www.opengroup.org/onlinepubs/007908775/xsh/mmap.html. Giống như rất nhiều câu hỏi về Unix apis, câu trả lời thực sự phụ thuộc vào unix nào. –

+0

@Logan: đủ công bằng, có vẻ như đó là một hạn chế không hợp lý. –

-1

Bộ nhớ chia sẻ cơ bản là một dạng IPC. Khu vực chia sẻ được tạo trong/dev/shm được tạo trong bộ nhớ (RAM) và không yêu cầu hoạt động đĩa, do đó nó là phương pháp nhanh hơn của IPC. Mặc dù IPC có thể được thực hiện bằng cách sử dụng tập tin đĩa và sau đó sử dụng mmap quá, nhưng nó sẽ được so sánh chậm. Ngoài ra bạn luôn có thể sử dụng MAP_ANONYMOUS với mmap mà không sao lưu với bất kỳ tập tin đĩa.

+1

MAP_ANONYMOUS dẫn đến bộ nhớ dùng chung như thế nào? – Flexo

+0

MAP_ANONYMOUS có thể dẫn đến bộ nhớ chia sẻ giữa các quá trình liên quan (trẻ em, cháu, vv và quá trình chia chúng). –

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