这个内存分配器有多好?

时间:2012-01-15 12:15:15

标签: c linux gcc x86-64

如您所知,mmapmalloc在具有地址空间布局随机化的系统上是不确定的。为了使我的内存分配具有确定性,我使用mmap来保留一个非常大的地址空间(在64位系统上),没有交换空间,即使用MAP_NORESERVE。然后,当我需要内存时,我通过在该地址空间范围内使用MAX_FIXED执行mmap来分配10 MB的空间。因此,分配的内存线性增长。

当我需要free内存时,我只需使用munmap取消映射。此外,我不会重新使用未映射的地址空间,而是继续分配。我想这并不会影响任何事情,因为我的地址空间(用mmap分配MAP_NORESERVE)非常大。

现在,问题是,内存分配器有多好。它当然不是一个非常聪明的,因为它不能分配小块的内存,因为通过mmap你分配了至少4096字节的内存,但我想它仍然是一个非常可行的解决方案。你觉得怎么样?

此外,对于进程仅分配因子4096的内存的情况。在那种情况下,我认为这种方法不会低于malloc

修改

请注意,我正在讨论关于两个相同冗余过程的确定性。一个是从另一个分叉的,因此它获取了具有MAP_NORESERVE的mmaped区域的初始地址,就像我之后fork一样。

2 个答案:

答案 0 :(得分:1)

  

使我的内存分配确定性

更简单的解决方案可能只是disable ASLR

  

内存分配器有多好。

这在很大程度上取决于您的质量标准。正如另一个答案所指出的那样,它不是一个非常好的通用分配器。但是,通用分配器通常不需要具有确定性。

据推测,您有这样的要求,也可能还有一些其他(尚未说明的)要求。

既然你已经让我们陷入你真正想做的事情,我们无法告诉你你所做的事情是否好。

答案 1 :(得分:0)

不好。迟早,你将耗尽虚拟内存。无论是迟早还是取决于你的进程分配和释放多少,但无论如何,它肯定不适合长期运行的守护进程。

但这种决定论要求很奇怪。即使您的内存分配是确定性的,也取决于输入。如果流程按稍微不同的顺序执行某些操作,则结果会有所不同 如果他们做的一切都完全一样,那他们又多余了?如果一个人会崩溃,那么另一个人会完全一样。