malloc 到底在后台做什么?

What is malloc doing, anyway?

我们以为 malloc 只是简单地向内核申请内存,但实际上它做了大量幕后工作。由于系统调用开销巨大,glibc 会一次性向内核申请大块内存,然后在用户态进行精细的切分与管理。文章通过构建一个简易的内存分配器,深入剖析了内存块(Chunk)的头部结构、空闲链表的管理机制,以及如何通过分裂(Splitting)和合并(Coalescing)来高效复用内存。此外,还揭示了虚拟内存与物理内存的差异,解释了为何释放内存后 RSS 未必立即下降,以及 trim 机制如何将内存真正归还给内核。这是一次从 syscall 成本到内存布局的底层探索。

malloc 的接口非常简洁:你请求一定数量的内存,就会得到一个指向连续字节块的 void 指针,仿佛它是凭空变出来的。
  1. senderista

    如果你想研究现代内存分配器的工作原理,我推荐像 mimalloc 这样的项目,它的代码库相当容易上手。顺便提一句,里面看不到 brk/sbrk(也没有边界标签,或者分割/合并操作……)。

  2. incognito124

    提醒自己要把那篇关于 malloc 历史的长文写完。差不多有 20 页,没靠 LLM,全是背景介绍和示例。内容涵盖了通用型 malloc,比如 dlmalloc、mimalloc、tcmalloc、jemalloc 等,同时也提到了一些特定用途的分配器,比如 scudo。

  3. assumed_throwaw

    有点跑题,但 malloc 抽象带来的复杂度和开销,正是让我对“仅用栈”语言(比如最近发布的 Goose)非常着迷的原因。彻底(几乎)抛弃它的想法既优雅又令人兴奋。就像现代编程语言发展出了良好的易用性从而替代了垃圾回收器一样,希望我们也能用同样的方式替代堆内存分配。

  4. K0IN

    当初刚接触 wasm,那时它还是新生事物且有了 clang 支持,我就自己写了一套 libc 和 malloc。这真是学习这些底层函数和技巧(比如空闲链表)的绝佳机会。我也很喜欢能读懂 wasm,而且工具链很棒,直接返回 .wat 文件就能阅读。

  5. projectileboy

    关于这个(及相关)主题的一个很好的学习资源:https://cs61.seas.harvard.edu/site/2026/

同日更多故事

2026-11-09