【问题标题】:how to use mmap and shm_open to shared memory among multiple independent processes如何使用 mmap 和 shm_open 在多个独立进程之间共享内存
【发布时间】:2019-11-28 22:22:28
【问题描述】:

我想在独立运行而不是fork的进程之间共享内存。

我已经阅读了 mmapshm_open 的手册页,但仍然对用法感到困惑。

  1. 共享内存,在我看来应该是不同进程之间映射虚拟内存空间的机制,但是为什么mmapfd这个参数呢?这是否意味着内存实际上是通过文件共享的?
  2. 另外,shm_open 似乎接受一个文件名作为它的参数,所以它实际上打开了一个文件?
  3. 既然我有多个独立的进程,应该如何通知其他进程共享的物理内存地址?

谁能给出一些在两个进程之间共享内存的示例代码?比如说,我们有进程producer和一个consumer进程,它们如何通过mmap共享的内存段进行通信?

【问题讨论】:

    标签: c++ c linux shared-memory mmap


    【解决方案1】:
    1. 基本上,是的 - 在 unix 上“一切都是文件”。不完全是,它不一定是磁盘上的文件,但实际上你可以根据需要使用磁盘上的文件。

    2. 正式地,shm_open 在其自己的命名共享内存对象命名空间中接受一个名称。它们需要以一个斜线开头,并且不应包含另一个斜线。您可以随意命名它们,但由于它是一个全局命名空间,因此最好生成随机名称(正确使用O_CREAT|O_EXCL 来检查冲突)并通过其他渠道(如配置中约定的状态目录)传达名称应用程序实例使用的文件),这样您就不会使其成为系统范围的单例。实际上,在 Linux 和其他常见系统上,共享内存命名空间只是一个目录/dev/shm,它通常作为非持久(内存中)文件系统类型挂载,以避免对磁盘的无用写入。

    3. 没有物理内存地址;它可能会有所不同,有时可能根本不存在(如果换出或页面干净且未触及)。映射的共享内存对象的虚拟地址也不是映射它的不同进程所共有的。识别内存的是共享内存对象文件(由打开的文件描述符引用)在其中的偏移量。因此,为了使用在不同进程的地址空间中独立映射的共享内存,您需要使用基址的偏移量,而不是绝对指针,在需要指针时将偏移量添加到基址(例如,传递给同步原语共享内存中的互斥量、条件变量、信号量等,或供您自己使用)。

    【讨论】:

    • 问题 3 试图询问如何在进程之间共享访问共享内存所需的信息。这可以通过在编译时为其固定名称来完成。否则,进程需要有某种方式来发现彼此或发布和读取信息。
    • @EricPostpischil:好的,我并没有真正这样解释它,而是将相应的信息合并到第 2 点..
    猜你喜欢
    • 2011-06-26
    • 2013-12-28
    • 2016-08-14
    • 1970-01-01
    • 1970-01-01
    • 2018-07-26
    • 1970-01-01
    • 1970-01-01
    • 2012-01-11
    相关资源
    最近更新 更多