我有一个奇怪的问题。我想一次性malloc 8GB内存,并计划稍后使用TLSF来管理这个堆。也就是说,我想避免在整个应用程序中使用malloc,只需在开始时获取一个大内存块,在结束时释放它。然而,这里有一个特殊之处。我以前一直在我的程序中使用dlmalloc。链接它和一切都很顺利。然而,现在当我尝试一次性malloc 8GB并链接dlmalloc使用它时,我在OSX上运行时会得到segmentation fault 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即使没有4GB RAM也会给我8GB malloc,这些是虚拟页面吗?为什么dlmalloc不这样做?我知道可能没有一个连续的8GB RAM块可以分配,但为什么会出现段错误而不是null ptr?
如果我不确定系统是否有那么多RAM,是否有一种可靠的(希望是平台中立的)解决方案可以从malloc中一次获得那么多RAM?
编辑:程序和我运行的操作系统都是64位的。
编辑2: 所以我又试了一下。结果发现如果我将分配分解成1GB块,也就是8个单独的malloc,那么使用dlmalloc就可以工作了。因此,这似乎是一个关于连续范围分配的问题,其中dlmalloc可能只在存在连续块时尝试分配。这使我的问题更难以表述。是否有一种跨平台的相对可靠的方法来获取那么大的内存块,无论是否使用dlmalloc,并且如果没有物理内存剩余,它不会失败(可以在交换区中,只要它不失败)。同时,是否有可能以跨平台的方式告诉malloc是在RAM还是在swap中。