如何使用mmap和shm_open在多个独立进程之间共享内存
how to use mmap and shm_open to shared memory among multiple independent processes
我想在进程之间共享内存,运行独立而不是fork
。
我已经阅读了 mmap
和 shm_open
的手册页,但仍然对用法感到困惑。
- 共享内存,在我看来应该是不同进程之间space映射虚拟内存的机制,但是为什么
mmap
会有fd
这个说法呢?这是否意味着内存实际上是通过文件共享的?
- 此外,
shm_open
似乎接受一个文件名作为它的参数,所以它实际上打开了一个文件?
- 由于我有多个独立的进程,一个应该如何通知其他进程共享物理内存地址?
谁能给出一些在两个进程之间共享内存的示例代码?比如说,我们有进程 producer
和一个 consumer
进程,它们将如何通过 mmap
共享的内存段进行通信?
本质上,是的——在 unix 上 "everything is a file"。不完全是,它不一定是 on-disk 文件,但事实上,如果需要,您可以使用 on-disk 文件。
正式地 shm_open
接受其命名共享内存对象命名空间中的名称。它们需要以单个斜杠开头,并且不应包含另一个斜杠。您可以随意命名它们,但由于它是一个全局命名空间,因此最好生成随机名称(正确使用 O_CREAT|O_EXCL
来检查冲突)并通过其他渠道(例如在您的应用程序实例使用的配置文件),这样您就不会将其设为 system-wide 单例。实际上,在 Linux 和其他常见系统上,共享内存命名空间只是一个目录 /dev/shm
,通常挂载为 non-persistent (in-memory) 文件系统类型以避免浪费写入磁盘。
没有物理内存地址;它可能会有所不同,有时可能根本不存在(如果换出或页面干净且未触及)。映射的共享内存对象的虚拟地址也不为映射它的不同进程所共有。标识内存的是共享内存对象文件(由打开的文件描述符引用)其中的偏移量。因此,为了使用独立映射到不同进程地址空间的共享内存,您需要使用基址的偏移量,而不是绝对指针,在需要指针时将偏移量添加到基址(例如,传递给同步原语共享内存中的互斥量、条件变量、信号量等,或供您自己使用。
我想在进程之间共享内存,运行独立而不是fork
。
我已经阅读了 mmap
和 shm_open
的手册页,但仍然对用法感到困惑。
- 共享内存,在我看来应该是不同进程之间space映射虚拟内存的机制,但是为什么
mmap
会有fd
这个说法呢?这是否意味着内存实际上是通过文件共享的? - 此外,
shm_open
似乎接受一个文件名作为它的参数,所以它实际上打开了一个文件? - 由于我有多个独立的进程,一个应该如何通知其他进程共享物理内存地址?
谁能给出一些在两个进程之间共享内存的示例代码?比如说,我们有进程 producer
和一个 consumer
进程,它们将如何通过 mmap
共享的内存段进行通信?
本质上,是的——在 unix 上 "everything is a file"。不完全是,它不一定是 on-disk 文件,但事实上,如果需要,您可以使用 on-disk 文件。
正式地
shm_open
接受其命名共享内存对象命名空间中的名称。它们需要以单个斜杠开头,并且不应包含另一个斜杠。您可以随意命名它们,但由于它是一个全局命名空间,因此最好生成随机名称(正确使用O_CREAT|O_EXCL
来检查冲突)并通过其他渠道(例如在您的应用程序实例使用的配置文件),这样您就不会将其设为 system-wide 单例。实际上,在 Linux 和其他常见系统上,共享内存命名空间只是一个目录/dev/shm
,通常挂载为 non-persistent (in-memory) 文件系统类型以避免浪费写入磁盘。没有物理内存地址;它可能会有所不同,有时可能根本不存在(如果换出或页面干净且未触及)。映射的共享内存对象的虚拟地址也不为映射它的不同进程所共有。标识内存的是共享内存对象文件(由打开的文件描述符引用)其中的偏移量。因此,为了使用独立映射到不同进程地址空间的共享内存,您需要使用基址的偏移量,而不是绝对指针,在需要指针时将偏移量添加到基址(例如,传递给同步原语共享内存中的互斥量、条件变量、信号量等,或供您自己使用。