限制malloc()的虚拟内存空间

时间:2012-05-04 22:22:25

标签: c malloc virtual memory-address

我编写了自己的my_malloc()函数来管理自己的物理内存。在我的应用程序中,我希望能够同时使用libc malloc()以及我自己的my_malloc()函数。所以我不知何故需要对虚拟地址空间进行分区,malloc应该始终只在其专用池中分配虚拟地址,与my_malloc()相同。我无法限制堆大小,我只需要保证malloc()和my_malloc()永远不会返回相同/重叠的虚拟地址。

谢谢!

4 个答案:

答案 0 :(得分:1)

一个答案是让my_malloc使用由malloc分配的内存。使用足够大的块将大多实现这一点;然后在每个块中,您的版本将维护自己的结构并将其中的一部分分配给调用者。

它变得棘手,因为您不能依赖于为您的版本扩展整个可用空间,就像从sbrk或类似地方获取内存时一样。所以你的版本必须保留几个块。

答案 1 :(得分:1)

一种可能性是在启动时my_malloc()调用malloc()来预先分配大量内存,然后将该内存分配给其调用者并相应地进行管理。但是,完整的实现需要处理垃圾收集和碎片整理。

另一种可能性是每次需要分配内存时只需my_malloc()调用malloc()并简单处理您感兴趣的任何“簿记”方面,例如分配的块数,数量块释放,最大未完成块,总分配内存,。这是迄今为止更安全,更有效的机制,因为您将所有“硬”操作传递给malloc()

答案 2 :(得分:1)

保留一大块虚拟地址空间,并将其作为my_malloc()分配的池。一旦从操作系统中保留了大量连续的内存区域,则后续对malloc()的调用必须来自其他地方。

例如,on Windows,您可以使用VirtualAlloc()来保留256mb的空间块。在您通过后续调用“提交”它之前,实际上不会分配内存,但它将保留一个地址范围(例如0x4000000-0x5000000),后续malloc()将不会使用该地址范围。然后你的my_malloc()可以根据请求从这个保留范围中提交块,并按照你编写的任何分配方案对它们进行细分。

我被告知the equivalent Linux call is mmap()。 (编辑:我之前说过“kmalloc或vmalloc,取决于您是否需要内存物理连续或不连续”,但这些是内核级别的功能。)

我们在我们的应用程序中使用此机制将特定大小的所有分配重定向到我们自己的自定义池块分配器中,以提高速度和效率。除此之外,它还允许我们保留certain specific sizesmore efficient for the CPU to handle的虚拟页面。

答案 3 :(得分:0)

如果在程序开头附近添加mmap(2)调用,则可以根据需要为所需地址分配尽可能多的内存(请参阅提示,' s通常会立即离开NULL以供操作系统确定);这将阻止malloc(3)或任何其他内存分配例程获取这些特定页面。

不要担心内存使用情况;由于现代系统非常乐意过度使用,因此您只需使用几百KB的内核空间来处理页表。还不错。