12

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

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

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

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

谢谢

编辑:
C++ 不提供垃圾收集器,垃圾收集器很慢。有些分配很容易释放,但有些分配需要垃圾收集器。

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

4

6 回答 6

16

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

于 2010-07-28T22:29:14.810 回答
5

在 *nix 中,malloc() 是在 C 库级别实现的。它使用 brk()/sbrk() 来增长/缩小数据段,并使用 mmap/munmap 来请求/释放内存映射。有关glibc 和 uClibc 中使用的 malloc 实现的描述,请参阅此页面。

于 2010-07-28T22:31:59.937 回答
4

如果您只是简单地包装系统调用,那么您可能不会在使用标准 malloc 时获得任何收益——这就是他们所做的一切。

在程序开始时 malloc (或 HeapAlloc() 等)单个内存块并自己管理分配到这个内存块中更为常见,如果您知道要创建/丢弃大量内存,这可能会更有效定期小块内存。

于 2010-07-28T22:30:07.990 回答
3

brk是在 Linux 上用于实现mallocfree. 尝试手册页以获取信息。

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

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

于 2010-07-28T22:27:18.397 回答
0

垃圾收集器很慢

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

于 2010-07-29T05:31:53.753 回答
0

尝试http://www.dent.med.uni-muenchen.de/~wmglo/malloc-slides.html获取指针。

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

于 2012-03-19T14:20:13.590 回答