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

标签 c linux posix ipc shared-memory

情况:

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

我的猜测:

我本来以为只有1份内存,处理write/read on。

但是后来我觉得其实有3个副本对不对?每个进程都有1个副本,由mmap()创建,第3个副本是共享内存对象,用于进程间同步,但我不确定。

问题是:

  • 那么内存有多少份? 1n+1(其中 n 是进程数)
  • 如果是n+1,这不会是一种内存浪费吗?进程直接通过它的fd读/写共享内存对象是否合适?

最佳答案

Then how many copy of memory there are? 1 or n+1 (where n is process count)

共享内存只有一份。

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

And is it proper for process to read/write to the shared memory object via its fd directly?

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

关于c - POSIX 共享内存 - 有多少内存副本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34554060/

相关文章:

c - C 中的赋值错误

c - 表达式必须是指向完整对象类型的指针吗?

c - 从文本文件中删除该行的最后一个成员

查看 sh 脚本中是否定义了函数的符合 POSIX 的方法

c - 是否可以将现有缓冲区映射到新文件?

c - 从 C 中的标准输入读取行的函数未按预期工作

Linux at命令脚本不断重复

linux - 如何在 Linux 中获取进程的进程树跟踪/日志?

linux - SCTP Destination unreachable(协议(protocol)不可达)

php - 是否有实用程序可以将 POSIX 转换为适用于 PHP 的 PCRE?