管理共享内存应该分配多少内存?(助推)

我正在寻找一个明确的答案(如果确实存在的话),即在通过boost::interprocessmanaged_shared_memory创建静态共享内存块时,应该分配多少内存。甚至official examples似乎也分配了arbitrarily large内存块。

考虑以下结构:

// Example: simple struct with two 4-byte fields
struct Point2D {
  int x, y;
};

我最初的反应是必要的大小应该是8个字节,或sizeof(Point2D)。当我尝试构造一个对象时,这个操作失败得很惨,在运行时出现了seg错误。

// BAD: 8 bytes is nowhere near enough memory allocated.
managed_shared_memory segment(create_only, "My shared memory", sizeof(Point2D));

什么读/写操作导致SEG-FAULTS?堆栈操作?是否在segment.construct()内临时分配?分配共享内存时需要多少开销?

通过反复试验,我发现将大小乘以4可以适用于上面的结构,但当我开始向struct添加更多字段时,它就失效了。所以,这是一次糟糕的黑客攻击。

有些人可能会争辩说,现代PC中的"内存很便宜",但我不同意这种理念,如果我能避免的话,我不喜欢分配超过我需要的内存。我昨天翻遍了Boost的文档,但没有找到任何建议。为今天学习新东西干杯!


解决方案

来自文档的this paragraph:

内存算法是一个对象,它 被放在 共享内存/内存映射文件 段。

内存段布局:

 ____________ __________ ____________________________________________  
|            |          |                                            | 
|   memory   | reserved |  The memory algorithm will return portions | 
| algorithm  |          |  of the rest of the segment.               | 
|____________|__________|____________________________________________| 

库在段的开头有额外的内存开销,因此占用了您请求的大小的几个字节。根据this post和this post,无法确定确切的额外字节数:

您无法计算它,因为有 是内存分配Booking和 中更改的碎片化问题 运行时取决于您的 分配/解除分配模式。和 共享内存按页分配 通过操作系统(在Linux 64k上为4K,在 Windows),因此任何分配都将 实际上,将四舍五入分配到 页面:

    managed_shared_memory segment(create_only, "name", 20);

将浪费与以下相同的内存:

    managed_shared_memory segment(create_only, "name", 4096);

相关文章