POSIX 共享内存 - 有多少个内存副本

Posted

技术标签:

【中文标题】POSIX 共享内存 - 有多少个内存副本【英文标题】:POSIX shared memory - How many copies of memory are there 【发布时间】:2016-01-01 06:27:53 【问题描述】:

情况:

如果进程 a 和 b 各自使用 mmap() 创建共享内存映射,使用相同的共享内存对象 /shm-a 作为备份文件。

我的猜测:

我原本以为只有 1 个内存副本,用于处理写入/读取。

但后来我想他们实际上有 3 个副本,对吧?每个进程都有一个由mmap()创建的副本,第三个副本是共享内存对象,用于在进程之间进行同步,但我不确定。

问题是:

那么有多少个内存副本呢? 1n+1(其中 n 是进程计数) 如果是n+1,这不是有点浪费内存吗?进程是否可以直接通过其fd 读取/写入共享内存对象?

【问题讨论】:

嗯,我想知道如果有多个内存区域,为什么会被称为共享内存...... 当我分享一本书时,我的本能就是使用复印机! 【参考方案1】:

那么内存有多少个副本呢? 1 或 n+1(其中 n 是进程数)

共享内存只有一份。

相同的物理内存映射到不同的进程。但它可能会映射到不同的地址。

进程直接通过其fd读取/写入共享内存对象是否合适?

是的。那其实就是共享内存的目的。一个进程写入共享内存的内容可以被另一个进程读取。这是一种非常快速的 IPC 形式。但是你必须小心你如何使用它。特别是,您需要担心并发访问以及共享内存中的共享指针。

【讨论】:

所以,当创建mmap()以磁盘文件为backed文件时,进程需要自己为磁盘文件分配内存;但是当使用共享内存对象作为备份文件时,项目只是将其映射到进程的虚拟地址,而不是在中间创建另一个内存副本,是这样吗? 您所说的在支持mmap() 的磁盘中分配内存 - 实际上只是调整磁盘上文件的大小以匹配映射内存的大小。将其视为一个涉及三个元素的系统 - 每个进程中的虚拟地址空间、虚拟内存映射到的物理内存以及后备存储对象(可以是磁盘文件或共享内存段)。对于共享内存,所有涉及的进程只有一份实际物理内存的副本。 我知道共享内存只有一个副本,我不确定每个进程是否会在共享内存上分配另一个内存,就像它在备份文件是常规文件的情况下所做的那样没有备份文件时的磁盘文件和匿名映射。 不确定你的意思。该进程为支持mmap()的磁盘文件分配任何内存。 好吧,就像我说的,当你使用mmap()时,虚拟内存被映射到进程地址空间,这个虚拟内存在必要时被映射到物理内存。必要时内存为swapped 到支持对象(无论是磁盘文件还是共享内存段)。除此之外,进程本身不分配任何内存。您的问题的答案是,对于共享内存,所有n 进程中只有1 个物理内存副本。我不确定你在哪个部分磕磕绊绊。也许你可以解释一下。

以上是关于POSIX 共享内存 - 有多少个内存副本的主要内容,如果未能解决你的问题,请参考以下文章

Python中的对象变量有多少个内存副本? [复制]

Posix 共享内存与映射文件

在线程中创建posix共享内存

共享内存和 POSIX 信号量

POSIX 共享内存 - 自动客户端通知的方法

Posix共享内存