【发布时间】:2018-08-22 07:13:12
【问题描述】:
我将一些数据存储在多个进程使用的共享内存数组中。在某些时候,我想扩大阵列。
假设进程之间已经存在同步机制
最初,进程 1 将创建段,进程 2 将打开它。
过程 1
shm_open() O_CREAT
ftruncate()
mmap() MAP_SHARED
过程 2
shm_open()
mmap()
在某些时候,一个进程想要扩大数组并调整共享段的大小。
处理 1 个调用
ftruncate()
mremap() MREMAP_MAYMOVE
是否应该通知进程 2 调整大小并调用mremap() 来更新它自己的虚拟地址?
如果必须通知进程 2,我正在考虑打开第二个共享内存段,其中包含一些元数据,例如表的容量和互斥体。
每个进程最初都从共享内存中存储表的容量,并且在每个操作中都会根据共享内存元数据值检查本地值。如果值发生变化,它将调用mremap()
如果在调整大小后必须在每个进程上调用mremap(),这是一种正确的方法吗?
【问题讨论】:
-
我相信目标进程应该按需更新自己的内存映射(当它想要访问超出其边界的东西时),但它必须跟踪当前映射的大小。但如果阵列可能缩小,此选项将失效。如果不是,这是无锁的。
-
因为这个问题的重点是
mremap(),它是 Linux 特有的,[linux] 是比 [posix] 更适用的标签(重新标记)。 -
这个问题有进展吗?
标签: c++ c linux shared-memory mmap