系统malloc vs大型malloc上的DLMalloc

时间:2013-07-26 15:27:00

标签: c memory memory-management malloc

我有一段时间没有编码,所以请原谅我。我有这个奇怪的问题。我试图一次性malloc 8GB,我打算稍后用TLSF管理那个堆。也就是说,我想避免在我的应用程序中进行mallocing,只需在开头获得一个大的glob并最终释放它。这是特殊的。我一直在使用dlmalloc直到我的程序。链接它,一切顺利。但是,现在当我尝试同时使用malloc 8GB并在dlmalloc中链接使用它时,我在OSX上运行时会得到分段错误11,而没有dlmalloc一切顺利。如果我使用gcc或clang无所谓。系统虽然没有8GB的RAM,但它有4GB。有趣的是,同样的事情发生在具有32GB RAM的Windows机器和具有16GB RAM的Ubuntu机器上。使用系统malloc它一切正常,分配完成并通过分配的内存进行简单迭代按预期在所有三个系统上工作。但是,当我在dlmalloc中链接时它失败了。用malloc和dlmalloc函数调用尝试了它。

分配本身并不是特别的,简单的c99。

[...]
size_t bytes = 1024LL*1024LL*1024LL*8LL;
unsigned long *m = (unsigned long*)malloc(bytes);
[...]

我对这里的几件事感到困惑。为什么系统malloc给我8GB malloc即使没有4GB或RAM的系统,那些虚拟页面?为什么dlmalloc不会这样做?我知道可能没有8GB内存的连续块可以分配,但为什么分段错误呢,为什么不是一个空的ptr?

是否存在一个可行的强大(希望平台中立)解决方案,即使我不确定系统会有那么多RAM,也可以从malloc中一次性获取大量RAM?

编辑:程序是64位,我正在运行的OS'。

EDIT2: 所以我玩了一些。事实证明,如果我将分配分解为1GB块,即8个独立的malloc,那么它与dlmalloc一起使用。因此,似乎是连续范围分配的问题,其中dlmalloc可能仅在存在连续块时尝试分配。这使得我的问题更难以制定。有没有一种确定的方法可以在平台上使用或不使用dlmalloc来获取内存块的大小,如果没有物理内存,则不会失败(只要它不会失败就可以在交换中)。也可以以跨平台的方式判断malloc是否处于ram或swap。

1 个答案:

答案 0 :(得分:2)

如果不是一个彻头彻尾的答案,我会给你一点看法。当我看到你试图分配8GB的连续RAM时,我感到畏缩。是的,64位计算和所有,这可能是“合法的”,但在普通的机器上,你可能会遇到很多边缘情况,32位传统代码在64位大小时窒息,并且只是普通的可用性问题,让大量的内存足以使这项工作成功。如果你想尝试这种事情,也许尝试malloc单个块,那么如果失败,则使用较小的块。这有点挫败了1块系统的目的。操作系统中可能存在某种“页面大小”,您可以将malloc大小链接到 - 以帮助提高性能,并且能够以您希望的数量获得内存。

在游戏控制台上,这种内存管理方法有点普遍 - 在启动时从操作系统中分配1个缓冲区尽可能大,然后将自己的内存管理器放在那里以避免操作系统开销和可能的低级分配代码。它还允许人们更好地控制不存在虚拟内存的系统上的内存碎片。但是在这些系统上,您还可以准确了解自己拥有多少RAM。

有没有办法以独立于平台的方式查看内存是物理还是虚拟?我不这么认为,但也许别人可以给出一个很好的答案,我会把这部分编辑掉。

所以不是100%的回答,而是一些随机的想法来帮助我内心想知道你在做什么,想要在一个块中有8GB的RAM,当它听起来像多个块时会正常工作。 :)