【问题标题】:How much memory should 'managed_shared_memory' allocate? (boost)'managed_shared_memory' 应该分配多少内存? (促进)
【发布时间】:2011-05-09 04:11:22
【问题描述】:

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

考虑以下结构:

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

我最初的反应是必要的大小是 8 个字节,或sizeof(Point2D)。当我尝试构造一个对象时,这会惨遭失败,在运行时给我段错误。

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

什么读/写操作导致了段错误?堆栈操作?在segment.construct() 内临时分配?分配共享内存时需要多少开销?

通过反复试验,我发现将大小乘以 4 可以适用于上述结构,但是当我开始向我的 struct 添加更多字段时,它就崩溃了。所以,这听起来很糟糕。

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

【问题讨论】:

  • 人们可能不同意我的观点,但我一生中从未按照“内存很便宜”的方式编写代码。购买内存不一定比以前贵,但很像钱。你拥有的越多,你花费的就越多。我为我的电脑购买的每一次内存升级,我都已经很快达到极限,因为我可以“运行更多的东西”。在这方面,我一直尝试保守地编写代码,因为 对于我的应用程序来说并不一定便宜。无论如何,只是我的 2c :)
  • 我同意 100%!这就是我提出这个问题的全部原因。我只是把那个评论放在那里以劝阻任何人说“谁在乎,只需分配 1k 并完成它。”我会尽量在帖子中说得更清楚。
  • 啊,好吧 :) “有些人可能会争论”要好得多!

标签: c++ boost shared-memory interprocess multiprocess


【解决方案1】:

来自文档的this paragraph

内存算法是一个对象 被放置在一个的第一个字节 共享内存/内存映射文件 段。

内存段布局:

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

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

你无法计算,因为有 是内存分配簿记和 碎片化问题的变化 运行时间取决于您的 分配/解除分配模式。和 共享内存按页分配 由操作系统(Linux 上的 4K 上的 64k windows),所以任何分配都将是 在实践中分配四舍五入到 页面:

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

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

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

【讨论】:

  • 找到那个旧帖子做得很好;我搜索了很长一段时间,然后就干了。那么,“确实”是指没有具体的答案吗?这就是我从 Ion Gaztañaga 的回复中得到的……另外,感谢您提供指向 Boost 文档的链接。内存映射 ASCII 艺术有帮助,尽管我没有运气以编程方式确定 memory algorithm + reserved。但最终,这是一个有争议的问题,因为我的实际实现存储了 5-10 个结构实例(Gaztañaga 也提到过)。尽管如此,这似乎是一个有效的问题,即使它主要是“学术”。
  • 啊,那里我们走了。我知道操作系统页面大小必须是一个相关的细节;上面的引用证实了我的怀疑。看起来“最佳猜测”分配将不得不做。再次感谢。
【解决方案2】:

使用操作系统的内存页面大小之类的方法有效。就我而言,这是可行的..

off_t size = sizeof(class1) + (sizeof(class2) * 3);
// round up to the OS page size.
long page_size = sysconf(_SC_PAGE_SIZE);
size = ((size / page_size) + (size % page_size ? 1 : 0)) * page_size;

使用 boost::managed_shared_memory 允许您在结果空间中构造对象。有点像....

shared_memory_object::remove(m_name.c_str());
m_shared.reset(new managed_shared_memory(create_only, "myspace", size));
m_class1 = m_shared->construct<class1>("class1")();
m_class2 = m_shared->construct<class2>("class2")[3]();

【讨论】:

  • +1 我喜欢四舍五入到系统页面大小的想法。但是,看起来我们仍在创建任意数量的填充。在这种情况下,“3”——三次sizeof(class2)。我对么?从那以后,我开始从事其他项目,但我仍然对以最少浪费的方式分配共享内存的最佳方式感兴趣。
  • 无论如何我都看不到使用共享内存区域的页面大小。 (修复了第二段代码中的一个错误。)但是,您可以执行我在共享内存区域内的第二段代码中使用的子分配类型。查看en.highscore.de/cpp/boost/… 可以很好地了解可以完成子分配的多种方式。我最好学习一下这个编辑器,这样我可以更干净地链接sigh
猜你喜欢
  • 2023-03-13
  • 1970-01-01
  • 1970-01-01
  • 2012-08-28
  • 1970-01-01
  • 2015-12-08
  • 2011-03-03
  • 2014-03-02
  • 2020-03-12
相关资源
最近更新 更多