【发布时间】:2012-11-26 22:00:45
【问题描述】:
我一直认为heap (data structure) 用于实现heap (dynamic memory allocation),但有人告诉我我错了。
堆(例如,典型的malloc 例程或Windows 的HeapCreate 等实现的堆)通常是如何实现的?他们使用什么数据结构?
我不是在问什么:
在网上搜索时,我看到了吨关于如何实现堆有严格限制的描述。
仅举几例,我已经看到很多关于如何实现的描述:
- 永远不会将内存释放回操作系统的堆 (!)
- 仅在类似大小的小块上提供合理性能的堆
- 只能为大的连续块提供合理性能的堆
- 等
有趣的是,他们都回避了更难的问题:
“正常”的通用堆(如 malloc、HeapCreate 后面的堆)是如何实现的?
他们使用什么数据结构(也许还有算法)?
【问题讨论】:
-
是的,这两种堆是不同的。要了解 dlmalloc(由 glibc 使用)或 tcmalloc(由 google 使用)的动态内存分配 google。
-
@brianbeuning:会看看 dlmalloc,谢谢。但是TCMalloc currently does not return any memory to the system.
-
@Mehrdad:是的。大多数(全部?)基于 Unix 的 malloc 不会将内存返回给系统。
-
我认为 C++ 和 C 标记在这里不合适,但我想不出更好的标记。
-
最近版本的 dlmalloc 有一个很酷的特性,叫做 mspaces。您可以在 mspace 上使用 malloc() 和 free(),或者您可以删除 mspace 并释放 mspace 中分配的所有内存。我们在我们的应用程序服务器中使用它,因此每个 Web 会话都有自己的 mspace。 mspace 极大地改善了页面和缓存的局部性,如果我们的代码有任何内存泄漏错误,删除 mspace 可以修复泄漏。我们的会话使用一个线程,因此 mspaces 可以帮助解决最近分配器解决的多线程问题。
标签: data-structures memory-management heap-memory