【发布时间】:2012-01-15 12:15:15
【问题描述】:
如您所知,mmap 和 malloc 在具有地址空间布局随机化的系统上是不确定的。为了使我的内存分配具有确定性,我使用mmap 来保留一个非常大的地址空间(在 64 位系统上),没有交换空间,即使用 MAP_NORESERVE。然后当我需要内存时,我通过在该地址空间范围内使用 MAX_FIXED 执行 mmap 分配 10 MB 的空间。因此,分配的内存线性增长。
当我需要free 内存时,我只需使用munmap 取消映射它。此外,我没有重新利用未映射的地址空间,而是继续提前分配。我想这并不会真正影响任何事情,因为我的地址空间(使用mmap 和 MAP_NORESERVE 分配)无论如何都非常大。
现在的问题是,这是一个多么好的内存分配器。它当然不是一个非常聪明的,因为它不能分配小块内存,因为通过mmap 你分配了至少 4096 字节的内存,但我想它仍然是一个相当可行的解决方案。你怎么看?
此外,如果进程仅分配因子 4096 的内存,该怎么办。在那种情况下,我认为这种方法不会逊于malloc。
编辑
请注意,我说的是关于两个相同冗余进程的确定性。一个是从另一个分叉出来的,所以它使用 MAP_NORESERVE 获取映射区域的初始地址,就像我之后做的 fork 一样。
【问题讨论】:
-
我想说的主要问题应该是:为什么你需要你的应用程序的内存是一个块?
-
这有什么意义?为什么你认为这会更“确定”?
-
ThiefMaster,在我的问题中添加了为什么我需要这个。
-
MAP_NORESERVE?你不是说MAP_SHARED吗? -
Darkdust,不,我说的是 MAP_NORESERVE,我的意思是 MAP_NORESERVE。另外我说的是私有分配的内存,因此是 MAP_PRIVATE,而不是 MAP_SHARED。