【发布时间】:2011-01-16 19:06:04
【问题描述】:
对这个主题有所了解后,谁能告诉我,POSIX 共享内存 (shm_open) 和 POSIX 映射文件 (mmap) 之间的真正区别是什么?
两者似乎都使用 /dev/tmpfs 子系统,而不是旧的 IPC 机制。
那么使用 mmap 文件比共享内存有什么优势吗?
谢谢。
【问题讨论】:
标签: posix shared-memory memory-mapped-files
对这个主题有所了解后,谁能告诉我,POSIX 共享内存 (shm_open) 和 POSIX 映射文件 (mmap) 之间的真正区别是什么?
两者似乎都使用 /dev/tmpfs 子系统,而不是旧的 IPC 机制。
那么使用 mmap 文件比共享内存有什么优势吗?
谢谢。
【问题讨论】:
标签: posix shared-memory memory-mapped-files
基本上共享内存是 IPC 的一种形式。共享区域是在 /dev/shm 中创建的,它只在内存(RAM)中创建,它不需要磁盘操作,因此它是一种更快的 IPC 方法。虽然 IPC 可以使用磁盘文件然后也使用 mmap 来完成,但它会比较慢。或者,您始终可以将 MAP_ANONYMOUS 与不备份任何磁盘文件的 mmap 一起使用。
【讨论】:
我的理解是共享内存是建立在映射文件之上的,但This Page 似乎表明使用内存映射文件作为共享内存的能力是有条件的。
mmap() 函数的使用受 QSHRMEMCTL 系统值的限制。当此系统值为 0 时,mmap() 函数可能不会创建具有 PROT_WRITE 功能的共享映射。从本质上讲,这可以防止创建可能改变正在映射的流文件内容的内存映射。如果 flags 参数指示 MAP_SHARED,prot 参数指定 PROT_WRITE 并且 QSHRMEMCTL 系统值为 0,则 mmap() 函数将失败,并导致 EACCES 错误数。
【讨论】:
区别并不总是很清楚。共享内存可以通过内存映射文件来实现。 An excellent write on this can be found here (as applied to C/C++ programming).
【讨论】: