2010-11-12 61 views
11

我正在寻找通过boost::interprocessmanaged_shared_memory创建静态块共享内存应分配多少内存的权威答案(如果确实存在)。即使official examples似乎分配了arbitrarily large大块的内存。'managed_shared_memory'应该分配多少内存? (boost)

考虑以下结构:

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

我最初的反应是必要的大小将是8个字节,或sizeof(Point2D)。当我试图构造一个对象时,这会失败,给我在运行时产生seg-fault。

// 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添加更多字段时会分崩离析。那么,这是一个糟糕的黑客攻击。

有些人可能会争辩说,现代个人电脑中的“记忆便宜”,但我不同意这种理念,并且如果我可以避免的话,不喜欢分配比我需要的更多。我昨天在Boost文档中搜索,找不到任何建议。这是今天学习新事物!

+1

人们可能会不同意我这里,但我从来没有在我的生活编码沿着“记忆便宜”的线。与过去的购买方式相比,购买内存不一定很昂贵,但它非常像金钱。你拥有的越多,花费越多。我为我的电脑购买的每一次内存升级,现在我可以“跑得更多”了。我一直试图在这方面进行保守编码,因为它对我的应用程序来说不一定便宜*。无论如何,只是我的2c :) – 2010-11-12 16:28:30

+0

我同意100%!这就是我正在问这个问题的**整个**原因。我只是在那里发表这个评论,劝阻任何人说“谁在乎,只分配1k并完成它”。我会尽量在帖子中更加清楚。 – 2010-11-12 16:37:08

+0

啊好的:)“有些人可能会争辩”要好得多! – 2010-11-12 16:56:55

回答

8

从文档的this paragraph

存储器算法是 置于 共享存储器/内存映射文件 段的第一字节的对象。

布局的内存段:

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

图书馆有一个额外的内存开销坐在段的开始,从而占领你的请求大小的几个字节。据this postthis post,不能确定的额外字节这个确切的数字:

你不能计算它,因为有 的内存分配bookeeping并在 运行时根据您的 分配改变 碎片问题/取消分配模式。而 共享内存由 由OS(4K上 窗口的Linux 64K)页面分配的,所以任何分配将在分配舍入到 页面实践 :

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

就会浪费相同内存:

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

找到那个旧帖子的好工作;我搜索了一会儿,然后干了起来。所以,通过“确实”,你的意思是**没有具体的答案吗?**这就是我从IonGaztañaga的回应中得到的结果......此外,感谢与Boost文档的链接。内存映射ASCII艺术帮助出来,虽然我没有在程序上确定'内存算法'+'保留'运气。但最终,这是一个有争议的问题,因为我的实际实现存储了5-10个结构实例(也由Gaztañaga提及)。尽管如此,这似乎是一个有效的问题,即使它主要是“学术”。 – 2010-11-12 21:23:13

+0

啊,*我们走了。我知道OS页面大小必须是相关的细节;上面的报价证实了我的怀疑。它看起来像“最佳猜测”分配将不得不做。再次感谢。 – 2010-11-12 22:30:23

2

喜欢的东西使用OS'es内存页大小的作品。在我的情况下,这工作..

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](); 
+0

+1我喜欢四舍五入到系统页面大小的想法。但是,它仍然看起来像我们正在创建**任意数量的填充**。在这种情况下,“3” - sizeof(class2)的三倍。我对么?自从我转向其他项目之后,我仍然对利用最少浪费分配共享内存的最佳方式感兴趣。 – 2011-01-12 19:35:56

+0

反正我看不到使用共享内存区域的页面大小。 (修正了第二位代码中的错误。) 但是,您可以在共享内存区域的第二位代码中执行我正在使用的子分配类型。 看看http://en.highscore.de/cpp/boost/interprocesscommunication.html#interprocesscommunication_managed_shared_memory可以很好地了解子分配的许多方法。 我最好学习这个编辑器,这样我可以更干净地链接*叹* – lprent 2011-01-12 23:07:16

相关问题