Posix共享内存与映射文件

28

在了解了一些有关主题的知识后,有人可以告诉我,POSIX共享内存(shm_open)和POSIX映射文件(mmap)之间的真正区别是什么吗?

两者似乎都使用/dev/tmpfs子系统,而不是较早的IPC机制。

那么使用mmap文件而不是共享内存是否有任何优势呢?

谢谢。

3个回答

19

3
我的理解是,共享内存是建立在映射文件之上的,但这个页面似乎表明,使用内存映射文件作为共享内存的能力是有条件的。
引用块中提到:mmap()函数的使用受QSHRMEMCTL系统值的限制。当该系统值为0时,mmap()函数可能无法创建具有PROT_WRITE功能的共享映射。实质上,这会防止创建一个可以改变被映射流文件内容的内存映射。如果flags参数指定为MAP_SHARED,prot参数指定为PROT_WRITE,并且QSHRMEMCTL系统值为0,则mmap()函数将失败,并返回EACCES错误号。

3
很有把握QSHRMEMCTL是iSeries特定的。例如在http://www.opengroup.org/onlinepubs/007908775/xsh/mmap.html中没有提到它。就像关于Unix api的许多问题一样,答案实际上取决于使用哪个Unix系统。 - Logan Capaldo
@Logan:说得对,这似乎是一个不合理的限制。 - John Knoeller

0

基本上共享内存是一种IPC形式。共享区域在/dev/shm中创建,该文件仅在内存(RAM)中创建,并且不需要任何磁盘操作,因此它是IPC的一种更快的方法。虽然可以使用磁盘文件进行IPC,然后再使用mmap,但它会相对较慢。或者,您始终可以使用带有mmap的MAP_ANONYMOUS,该mmap不支持任何磁盘文件备份。


1
MAP_ANONYMOUS如何导致共享内存? - Flexo
3
MAP_ANONYMOUS 可以导致相关进程(子进程、孙子进程等及创建它们的进程)之间共享内存。 - Robert Sanders

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接