如您所知,mmap
和malloc
在具有地址空间布局随机化的系统上是不确定的。为了使我的内存分配具有确定性,我使用mmap
来保留一个非常大的地址空间(在64位系统上),没有交换空间,即使用MAP_NORESERVE。然后,当我需要内存时,我通过在该地址空间范围内使用MAX_FIXED执行mmap
来分配10 MB的空间。因此,分配的内存线性增长。
当我需要free
内存时,我只需使用munmap
取消映射。此外,我不会重新使用未映射的地址空间,而是继续分配。我想这并不会影响任何事情,因为我的地址空间(用mmap
分配MAP_NORESERVE)非常大。
现在,问题是,内存分配器有多好。它当然不是一个非常聪明的,因为它不能分配小块的内存,因为通过mmap
你分配了至少4096字节的内存,但我想它仍然是一个非常可行的解决方案。你觉得怎么样?
此外,对于进程仅分配因子4096的内存的情况。在那种情况下,我认为这种方法不会低于malloc
。
请注意,我正在讨论关于两个相同冗余过程的确定性。一个是从另一个分叉的,因此它获取了具有MAP_NORESERVE的mmaped区域的初始地址,就像我之后fork
一样。
答案 0 :(得分:1)
使我的内存分配确定性
更简单的解决方案可能只是disable ASLR。
内存分配器有多好。
这在很大程度上取决于您的质量标准。正如另一个答案所指出的那样,它不是一个非常好的通用分配器。但是,通用分配器通常不需要具有确定性。
据推测,您有这样的要求,也可能还有一些其他(尚未说明的)要求。
既然你已经让我们陷入你真正想做的事情,我们无法告诉你你所做的事情是否好。
答案 1 :(得分:0)
不好。迟早,你将耗尽虚拟内存。无论是迟早还是取决于你的进程分配和释放多少,但无论如何,它肯定不适合长期运行的守护进程。
但这种决定论要求很奇怪。即使您的内存分配是确定性的,也取决于输入。如果流程按稍微不同的顺序执行某些操作,则结果会有所不同 如果他们做的一切都完全一样,那他们又多余了?如果一个人会崩溃,那么另一个人会完全一样。