管理共享内存应该分配多少内存?(助推)
我正在寻找一个明确的答案(如果确实存在的话),即在通过boost::interprocess
的managed_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);
相关文章