如何创建可随时间扩展的共享内存区域?

问题描述:

我需要使用一个旧的C++项目,其中每个进程都将相同的数据加载到内存中。这是只读的,每个进程都有完全相同的数据副本。最近服务已经开始颠簸它运行的系统。如何创建可随时间扩展的共享内存区域?

我正在评估可以对此进行更改的方式,我认为boost interprocess库非常适合我的用例。我考虑的另一件事是使用外部数据存储,但由于延迟,我不太愿意使用它。

我看了一下boost apis,他们似乎要求我们指定共享内存区域的大小。在我的情况下,随着时间的推移,需要加载的数据量不断增加。这个共享内存是否可调整大小?

也可以在类似的情况下自由地对该问题或boost interprocess提出替代建议。

+0

不是说你不能这样做,但是如何使用共享内存的进程知道它已经增长了?当您需要更多空间时,是否可以使用多个区域并添加更多区域?我完全不熟悉这个“增强”库,所以我不能说。 – 2013-04-26 09:19:16

+0

@MatsPetersson在最简单的情况下,你可以使用类似于'vector'的东西来记录它的'size'和'capacity'。 – 2013-04-26 09:21:17

+0

它仍然会要求使用这些数据的应用程序“检查它是否已经长大”或其他类似情况。我仍然认为有几种可能的解决方案,并非所有解决方案都与“增加”共享区域的大小有关。 – 2013-04-26 09:45:04

要调整共享内存的大小,可以使用shmctl,其中cmd=SHM_SIZE

这样做时你必须小心。如果你减小了尺寸,而其他进程访问超出尺寸的内存,你将得到SIGBUS信号。

另一个问题是如何通知其他进程调整了共享内存的大小。我想你可以使用消息队列或其他IPC机制。

+0

这是否也适用于'boost'呢? – nikhil 2013-04-26 10:05:34

+1

@nikhil不知道。我看到它有shared_memory_object :: truncate方法来设置大小,但我不确定它是否允许调整共享内存的大小。此外,只读共享内存对象的大小被传递给构造函数。你将不得不重新创建对象。 – 2013-04-26 10:11:43

+0

噢好吧,我们只需要在区域可以写入的情况下调用truncate。谢谢你,我还会读到'shmctl'。 – nikhil 2013-04-26 10:52:52