Posix 共享内存与映射文件
Posted
技术标签:
【中文标题】Posix 共享内存与映射文件【英文标题】:Posix shared memory vs mapped files 【发布时间】:2011-01-16 19:06:04 【问题描述】:对这个主题有所了解后,谁能告诉我,POSIX 共享内存 (shm_open) 和 POSIX 映射文件 (mmap) 之间的真正区别是什么?
两者似乎都使用 /dev/tmpfs 子系统,而不是旧的 IPC 机制。
那么使用 mmap 文件比共享内存有什么优势吗?
谢谢。
【问题讨论】:
【参考方案1】:基本上共享内存是 IPC 的一种形式。共享区域是在 /dev/shm 中创建的,它只在内存(RAM)中创建,它不需要磁盘操作,因此它是一种更快的 IPC 方法。虽然 IPC 可以使用磁盘文件然后也使用 mmap 来完成,但它会比较慢。或者,您始终可以将 MAP_ANONYMOUS 与不备份任何磁盘文件的 mmap 一起使用。
【讨论】:
MAP_ANONYMOUS 如何导致共享内存? MAP_ANONYMOUS 会导致相关进程(子、孙等以及派生它们的进程)之间共享内存。【参考方案2】:我的理解是共享内存是建立在映射文件之上的,但This Page 似乎表明使用内存映射文件作为共享内存的能力是有条件的。
mmap() 函数的使用受 QSHRMEMCTL 系统值的限制。当此系统值为 0 时,mmap() 函数可能不会创建具有 PROT_WRITE 功能的共享映射。从本质上讲,这可以防止创建可能改变正在映射的流文件内容的内存映射。如果 flags 参数指示 MAP_SHARED,prot 参数指定 PROT_WRITE 并且 QSHRMEMCTL 系统值为 0,则 mmap() 函数将失败,并导致 EACCES 错误数。
【讨论】:
相当肯定 QSHRMEMCTL 是特定于 iSeries 的。例如,opengroup.org/onlinepubs/007908775/xsh/mmap.html 中没有提及它。就像许多关于 Unix api 的问题一样,答案实际上取决于哪个 unix。 @Logan:很公平,这似乎是一个不合理的限制。【参考方案3】:区别并不总是很清楚。共享内存可以通过内存映射文件来实现。 An excellent write on this can be found here (as applied to C/C++ programming).
【讨论】:
以上是关于Posix 共享内存与映射文件的主要内容,如果未能解决你的问题,请参考以下文章