【问题标题】:Posix shared memory vs mapped filesPosix 共享内存与映射文件
【发布时间】:2011-01-16 19:06:04
【问题描述】:

对这个主题有所了解后,谁能告诉我,POSIX 共享内存 (shm_open) 和 POSIX 映射文件 (mmap) 之间的真正区别是什么?

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

那么使用 mmap 文件比共享内存有什么优势吗?

谢谢。

【问题讨论】:

    标签: posix shared-memory memory-mapped-files


    【解决方案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).

    【讨论】:

      猜你喜欢
      • 2014-10-08
      • 2023-03-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-06
      相关资源
      最近更新 更多