如何创建可随时间扩展的共享内存区域?
问题描述:
我需要使用一个旧的C++项目,其中每个进程都将相同的数据加载到内存中。这是只读的,每个进程都有完全相同的数据副本。最近服务已经开始颠簸它运行的系统。如何创建可随时间扩展的共享内存区域?
我正在评估可以对此进行更改的方式,我认为boost interprocess
库非常适合我的用例。我考虑的另一件事是使用外部数据存储,但由于延迟,我不太愿意使用它。
我看了一下boost
apis,他们似乎要求我们指定共享内存区域的大小。在我的情况下,随着时间的推移,需要加载的数据量不断增加。这个共享内存是否可调整大小?
也可以在类似的情况下自由地对该问题或boost interprocess
提出替代建议。
答
要调整共享内存的大小,可以使用shmctl,其中cmd=SHM_SIZE
。
这样做时你必须小心。如果你减小了尺寸,而其他进程访问超出尺寸的内存,你将得到SIGBUS信号。
另一个问题是如何通知其他进程调整了共享内存的大小。我想你可以使用消息队列或其他IPC机制。
不是说你不能这样做,但是如何使用共享内存的进程知道它已经增长了?当您需要更多空间时,是否可以使用多个区域并添加更多区域?我完全不熟悉这个“增强”库,所以我不能说。 – 2013-04-26 09:19:16
@MatsPetersson在最简单的情况下,你可以使用类似于'vector'的东西来记录它的'size'和'capacity'。 – 2013-04-26 09:21:17
它仍然会要求使用这些数据的应用程序“检查它是否已经长大”或其他类似情况。我仍然认为有几种可能的解决方案,并非所有解决方案都与“增加”共享区域的大小有关。 – 2013-04-26 09:45:04