繁体   English   中英

如何使用 mmap 和 shm_open 在多个独立进程之间共享内存

[英]how to use mmap and shm_open to shared memory among multiple independent processes

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

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

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

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

  1. 本质上,是的 - 在 unix 上“一切都是文件”。 不完全是,它不必是磁盘文件,但实际上,如果需要,您可以使用磁盘文件。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM