【发布时间】:2011-08-21 19:50:56
【问题描述】:
我想在多个进程之间使用共享内存,并且希望能够继续使用原始指针(和 stl 容器)。
为此,我使用了映射在固定地址的共享内存:
segment = new boost::interprocess::managed_shared_memory(
boost::interprocess::open_or_create,
"MySegmentName",
1048576, // alloc size
(void *)0x400000000LL // fixed address
);
选择这个固定地址的好策略是什么?例如,我应该只使用一个相当大的数字来减少我用完堆空间的机会吗?
【问题讨论】:
-
如果您在 Windows 上,VMMap 可以帮助您选择,但您也应该意识到系统上不受您控制的其他应用程序可以将它们的 DLL 注入您的内存空间,从而使您做出的任何决定无效。
-
您可能需要考虑尝试共享空间的应用程序之间的某种选举协议,它们可以在其中协商要在它们之间使用的公共地址。或者,只需使用正确的
boost::interprocess::shared_ptr<family>对象。鉴于它们是有效的分段 + 偏移,它们的设计目的是尽可能获得可靠的最佳性能。应用程序是否对性能如此敏感以至于这种额外的间接查找很重要? -
另外,堆空间用完是不太可能的。当需要增加堆时,堆管理器会向操作系统请求额外的内存。堆不是(通常)一个大舞台,而是许多连接在一起的。
-
或者,@Joseph Garvin 在我输入所有 cmets 时所说的话。 :-)
-
为什么不使用 STL 分配器,它专门在特定的内存块中分配,给定起始地址和长度?然后,您可以在每个进程中使用 named 内存映射(产生任何地址)并将映射的地址+长度交给分配器。对我来说,这似乎比依赖和篡改固定地址更不容易失败。
标签: c++ boost shared-memory interprocess