malloc和free是如何实现的?

时间:2010-07-28 22:24:21

标签: c++ dynamic-memory-allocation

我想实现自己的动态内存管理系统,以便添加有助于用​​C ++管理内存的新功能。

我使用Windows(XP)和Linux(Ubuntu)。 实现'malloc'和'free'等功能需要什么? 我认为我必须使用最低级别的系统调用。

对于Windows,我找到了以下函数:GetProcessHeap,HeapAlloc,HeapCreate,HeapDestroy和HeapFree。

对于Linux,我没有找到任何系统调用堆管理。在Linux上,malloc和free是系统调用,不是吗?

由于

修改
C ++不提供垃圾收集器和垃圾收集器很慢。有些分配很容易免费,但有些分配需要垃圾收集器。

我想实现这些功能并添加新功能:
*每当调用free()时,检查指针是否属于堆 *帮助垃圾收集。我必须存储一些有关已分配块的信息 *使用多个堆(Windows上的HeapCreate / HeapDestroy)。我可以快速删除整个堆及其分配的块。

6 个答案:

答案 0 :(得分:14)

在linux上,malloc和free不是系统调用。 malloc / free通过使用brk系统调用扩展和收缩(如果可以)数据段以及获取mmap的匿名内存来从内核获取内存 - malloc管理这些区域内的内存。一些基本信息可以找到许多很好的参考资料here

答案 1 :(得分:4)

如果您只是简单地包装系统调用,那么您可能无法使用标准的malloc - 这就是他们所做的一切。

malloc(或HeapAlloc()等)在程序开始时单个内存块更为常见,并自行管理分配,如果您知道要创建/丢弃,这可能更有效经常有很多小块的记忆。

答案 2 :(得分:4)

在* nix中,malloc()在C库级别实现。它使用brk()/ sbrk()来扩展/收缩数据段,使用mmap / munmap来请求/释放内存映射。有关glibc和uClibc中使用的malloc实现的描述,请参阅this page

答案 3 :(得分:3)

brk是Linux上用于实现mallocfree的系统调用。请尝试手册页以获取信息。

你已经把Windows的东西搞定了。

在这里看到其他答案,我想指出你可能正在重新发明轮子;已经有很多很好的malloc实现。但是编程malloc是一个很好的思考练习 - 看一下here来完成一个很好的家庭作业(最初是CMU代码)。他们的shell比Linux操作系统实际上提供的更多,但是: - )。

答案 4 :(得分:0)

  

垃圾收集器很慢

这是一个完全没有意义的陈述。在许多实际情况中,程序可以通过使用垃圾收集器获得显着的性能提升,尤其是在多线程场景中。在许多其他情况下,垃圾收集器确实会导致性能下降。

答案 5 :(得分:0)

尝试使用http://www.dent.med.uni-muenchen.de/~wmglo/malloc-slides.html作为指针。

这是一个简短的性能比较,指向八个不同的malloc / free实现。一个很好的起点,因为一些好的参考统计数据将帮助您确定是否改进了可用的实现 - 或者不是。