malloc 和 free 是如何实现的?
Posted
技术标签:
【中文标题】malloc 和 free 是如何实现的?【英文标题】:How are malloc and free implemented? 【发布时间】:2011-03-22 10:40:37 【问题描述】:我想实现自己的动态内存管理系统,以便添加有助于在 C++ 中管理内存的新功能。
我使用 Windows (XP) 和 Linux (Ubuntu)。 实现“malloc”和“free”等功能需要什么? 我认为我必须使用最低级别的系统调用。
对于 Windows,我找到了函数:GetProcessHeap、HeapAlloc、HeapCreate、HeapDestroy 和 HeapFree。
对于 Linux,我没有发现任何用于堆管理的系统调用。在 Linux 上,malloc 和 free 是系统调用,不是吗?
谢谢
编辑: C++ 不提供垃圾收集器,垃圾收集器很慢。有些分配很容易释放,但有些分配需要垃圾收集器。
我想实现这些功能并添加新功能: * 每当调用 free() 时,检查指针是否属于堆。 *帮助垃圾收集。我必须存储一些有关已分配块的信息。 * 使用多个堆(Windows 上的 HeapCreate/HeapDestroy)。我可以快速删除整个堆及其分配的块。
【问题讨论】:
你应该看看 boost 的池分配器:boost.org/doc/libs/1_43_0/libs/pool/doc/index.html 你确定 HeapAlloc 是系统(内核)调用吗?这些很可能在用户端实现,并在进程需要更多内存时触发一些隐藏的私有内核端函数。 Squall - 从措辞上看,这听起来有点像家庭作业问题。是的?没有? 编写内存管理代码非常重要。如果这是家庭作业就好了。但是我认为不值得花时间为你正在编写的任何应用程序编写任何主要的东西,除非你已经非常熟悉操作系统和运行时系统如何与内存交互。即使这样,通常也不值得付出努力,因为 new/malloc 都针对一般情况进行了高度优化,并且在大多数情况下都能很好地工作。除非您对内存使用情况进行了分析,并且有一个非常独特的模式可以为您优化,否则不太可能做得比提供的更好。 How do malloc() and free() work?的可能重复 【参考方案1】:在 linux 上,malloc 和 free 不是系统调用。 malloc/free 通过使用brk
系统调用以及使用mmap
获得匿名内存来扩展和收缩(如果可以的话)数据段从内核获取内存 - 并且 malloc 管理这些区域内的内存。一些基本信息可以找到很多很好的参考资料here
【讨论】:
其实sbrk
不是系统调用,而是库函数。【参考方案2】:
在 *nix 中,malloc() 是在 C 库级别实现的。它使用 brk()/sbrk() 来增长/缩小数据段,并使用 mmap/munmap 来请求/释放内存映射。有关 glibc 和 uClibc 中使用的 malloc 实现的描述,请参阅 this page。
【讨论】:
【参考方案3】:如果您只是简单地包装系统调用,那么您可能不会在使用标准 malloc 时获得任何收益——这就是他们所做的一切。
更常见的是在程序开始时 malloc(或 HeapAlloc() 等)单个内存块并自己管理分配给它,如果您知道您将要创建/丢弃,这可能会更有效很多小块的内存定期。
【讨论】:
【参考方案4】:brk
是Linux上用来实现malloc
和free
的系统调用。尝试手册页以获取信息。
你已经把 Windows 的东西搞定了。
在这里看到其他答案,我想指出您可能正在重新发明***;已经有很多好的malloc
实现了。但是编程malloc
是一个很好的思考练习——看看here 一个很好的家庭作业(最初是CMU 代码)实现相同。他们的 shell 比 Linux 操作系统提供的更多,不过 :-)。
【讨论】:
【参考方案5】:垃圾收集器很慢
这是一个完全没有意义的陈述。在许多实际情况下,程序可以通过使用垃圾收集器获得显着的性能提升,尤其是在多线程场景中。在许多其他情况下,垃圾收集器确实会导致性能损失。
【讨论】:
垃圾收集器如何一般慢【参考方案6】:尝试http://www.dent.med.uni-muenchen.de/~wmglo/malloc-slides.html 获取指针。
这是一个简短的性能比较,指向八种不同的 malloc/free 实现。一个很好的起点,因为一些好的参考统计数据将帮助您确定您是否改进了可用的实现。
【讨论】:
以上是关于malloc 和 free 是如何实现的?的主要内容,如果未能解决你的问题,请参考以下文章