glibc中的mmap和哈希表扩展问题

时间:2011-10-24 08:12:18

标签: malloc virtual hashtable glibc mmap

在检测堆损坏的方法中,我试图实现一个哈希表来保存有关malloced内存的一些信息。这是在glibc内部完成的。当我们使用malloc()时,我们将地址和大小等信息放在哈希表中,当我们free()时,我们再次在glibc的free()本身中释放相应的哈希表条目。

为哈希表分配内存我已经mmap了一些内存(为此避免使用malloc,因为进程引发堆损坏的可能性也会破坏我的哈希表)。 问题是进程可以请求的malloc数量没有限制,这要求我的哈希表是可扩展的。由于我的哈希表适用于数组索引,因此用于哈希表的内存需要是连续的,因此使用索引我们可以轻松地访问存储桶或记录。现在,当哈希表使用所有内存时,我需要再次执行'mmap',使得此内存从前一个结束的地方开始。 mmap的man页面说我们可以为mmap提供一个地址,它将作为内核的提示来映射该地址的虚拟内存。对于哈希表,它看起来像一个contguouis内存块。我想问你一下这种方法的可靠性以及使用它的潜在缺陷是什么。

2 个答案:

答案 0 :(得分:2)

如果是Linux,您可以使用mremap

如果您将哈希表编写为基于偏移而不是绝对指针,则可以传递MREMAP_MAYMOVE标志,而不必担心分配失败。 (好吧,无论如何,直到耗尽虚拟内存。)

答案 1 :(得分:1)

  

这种方法有多可靠

MAP_FIXED非常可靠: IF 您要求的内存可用,内核会将其提供给您。

  

潜在的缺陷是什么

显而易见的一点:其他一些东西可能会mmap进入你想要延伸的区域,而你却输了。

如果您是为64位进程执行此操作,则可以mmap,例如1TB的内存作为您的初始哈希表分配。只要您实际上没有访问它,假设您正在进行mmap映射,那么MA_ANON实际上是免费的(费用)。

顺便说一下,我希望你意识到你在这里重新发明了一辆自行车,因为许多现有的解决方案(例如tcmalloc和jemalloc)已经提供了调试设施,无论你自己编造什么,这些设施都可能更好。