【问题标题】:Why use SysV or POSIX shared memory vs mmap()?为什么使用 SysV 或 POSIX 共享内存与 mmap()?
【发布时间】:2010-11-10 13:03:27
【问题描述】:

需要使用 IPC 将大量数据 (200kb+) 从子进程传递到 OS X 10.4 及更高版本的父进程,我阅读了 Unix 上的共享内存,特别是 System V 和 POSIX 共享内存机制。然后我意识到 mmap() 可以与 MAP_ANON 和 MAP_SHARED 标志一起使用来做类似的事情(或者只使用 MAP_SHARED 标志,如果我不介意创建常规文件)。

我的问题是,有什么理由不只使用 mmap()?看起来简单多了,内存仍然是共享的,如果我使用 MAP_ANON 就不必创建真正的文件。我可以在父进程中创建文件,然后 fork() 和 exec() 子进程并在子进程中使用它。

问题的第二部分是,这种方法不够用的原因是什么,必须使用 SysV 或 POSIX 共享内存机制?

请注意,我计划使用其他通信所需的管道进行同步,即父级通过管道请求数据,子级将其写入共享内存,并通过管道响应它准备好。不涉及多个读者或作者。便携性不是首要任务。

【问题讨论】:

  • 如果我使用 MAP_ANON。我可以在父进程中创建文件,然后 fork() 和 exec() 子进程并在子进程中使用它。 -> 你设法以某种方式完成了这个吗?据我所知,没有办法让 mmap()ed 内存在 exec 中存活下来。它确实可以在 fork 中存活,但不能在 exec 中存活。

标签: macos unix shared-memory


【解决方案1】:

如果你有父/子关系,使用 mmap 完全没问题。

sysv_shm 是原始的 unix 实现,它允许相关和不相关的进程共享内存。 posix_shm 标准化的共享内存。

如果你在没有 mmap 的 posix 系统上,你会使用 posix_shm。如果你在没有 posix_shm 的 unix 上,你会使用 sysv_shm。如果您只需要与父/子共享内存,则可以使用 mmap。

【讨论】:

  • 你不能在没有 mmap 的情况下使用 posix_shm,那部分是无稽之谈。不过,您在第一段中是正确的,当您没有父/子关系时,posix_shm 启用 mmap。
  • 不相关的进程可以与mmap 共享内存,如果它们通过实际文件会合。
【解决方案2】:

如果没有记错的话,使用 SysV/POSIX 而不是mmap 的唯一原因是可移植性。特别是较旧的 Unix 系统不支持MAP_ANON。然而,Solaris、Linux、BSD 和 OS X确实,所以在实践中,几乎没有理由不使用mmap

【讨论】:

    【解决方案3】:

    Linux 中的shm 通常通过/dev/shm 文件实现,该文件获得mmapped,因此,性能应该是相同的——我会选择mmap(w/MAP_ANONMAP_SHARED正如您所提到的)为简单起见,如果我知道可移植性不是您所说的问题。

    【讨论】:

    • memfd_create() 现在也在几乎所有受支持的 Linux 内核版本中实现。
    【解决方案4】:

    documentation 所知,如果您想使用Xlib/XCB 共享内存映像,您必须使用 SYSV 共享内存。

    【讨论】:

      猜你喜欢
      • 2014-10-08
      • 1970-01-01
      • 2014-02-14
      • 2012-10-24
      • 1970-01-01
      • 2021-12-19
      • 1970-01-01
      • 1970-01-01
      • 2011-01-16
      相关资源
      最近更新 更多