我想实现自己的动态内存管理系统,以便添加有助于用C ++管理内存的新功能。
我使用Windows(XP)和Linux(Ubuntu)。 实现'malloc'和'free'等功能需要什么? 我认为我必须使用最低级别的系统调用。
对于Windows,我找到了以下函数:GetProcessHeap,HeapAlloc,HeapCreate,HeapDestroy和HeapFree。
对于Linux,我没有找到任何系统调用堆管理。在Linux上,malloc和free是系统调用,不是吗?
由于
修改
C ++不提供垃圾收集器和垃圾收集器很慢。有些分配很容易免费,但有些分配需要垃圾收集器。
我想实现这些功能并添加新功能:
*每当调用free()时,检查指针是否属于堆
*帮助垃圾收集。我必须存储一些有关已分配块的信息
*使用多个堆(Windows上的HeapCreate / HeapDestroy)。我可以快速删除整个堆及其分配的块。
答案 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上用于实现malloc
和free
的系统调用。请尝试手册页以获取信息。
你已经把Windows的东西搞定了。
在这里看到其他答案,我想指出你可能正在重新发明轮子;已经有很多很好的malloc
实现。但是编程malloc
是一个很好的思考练习 - 看一下here来完成一个很好的家庭作业(最初是CMU代码)。他们的shell比Linux操作系统实际上提供的更多,但是: - )。
答案 4 :(得分:0)
垃圾收集器很慢
这是一个完全没有意义的陈述。在许多实际情况中,程序可以通过使用垃圾收集器获得显着的性能提升,尤其是在多线程场景中。在许多其他情况下,垃圾收集器确实会导致性能下降。
答案 5 :(得分:0)
尝试使用http://www.dent.med.uni-muenchen.de/~wmglo/malloc-slides.html作为指针。
这是一个简短的性能比较,指向八个不同的malloc / free实现。一个很好的起点,因为一些好的参考统计数据将帮助您确定是否改进了可用的实现 - 或者不是。