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 共享内存与映射文件的主要内容,如果未能解决你的问题,请参考以下文章

Posix共享内存区

Linux编程之共享内存

linux进程间通信之Posix共享内存用法详解及代码举例

mmap详谈

Linux CPOSIX 共享内存使用

Posix共享内存