Unix 第四版中失落的 malloc 接口

The lost malloc()

我最近沉迷于 Unix 考古,深入研究了 1973 年发布的 Unix 第四版源码。令人惊讶的是,当时的内存管理并非我们今天熟悉的 malloc/free 模式,而是通过显式传递 coremap 和 swapmap 来操作特定的内存区域。这种设计不仅避免了堆指针失效问题,还能自然地实现内存分区,大幅降低堆损坏风险。从 V4 的线性分配器到 V6 的 arena 概念,再到 V8 中类似 C++ new 的宏定义,这段历史揭示了现代内存管理机制的演变脉络。重温这些古老代码,让我对系统设计的简洁与优雅有了全新的认识。

这些接口一直沿用到 V6 版本,其背后的原因很可能是受限于当时的硬件条件。
  1. adrian_b

    作者并没有真正找到 SIMULA 67 中的 "new" 是从哪里来的。

    1965 年 11 月,C.A.R. Hoare 发表了一篇极具影响力的论文:"Record Handling"。这是为 ALGOL 60 的继任者提出的一项扩展。

    SIMULA 67 相对于其前身 SIMULA 语言所增加的几乎所有特性,都直接源自 Hoare 的这篇论文,只有两个重大例外:类继承和 "virtual"(虚拟)过程,这两者是由 SIMULA 67 的创造者(Kristen Nygaard 和 Ole-Johan Dahl)发明的,也是面向对象编程的核心。

    SIMULA 67 的关键字 "class" 和 "new" 均取自 Hoare 的论文(实际上 Hoare 是从 COBOL 60 借用了 "class",COBOL 60 使用的术语与 ALGOL 60 截然不同,诸多差异之一就是用 "class" 代替了 ALGOL 60 中的 "type")。

    Hoare 的论文讨论了大量编程语言特性,其中大多数都是新的,包括定义带有构造函数和析构函数的结构体类型、判别式联合(取自 John McCarthy)、枚举、NULL 指针等等。

    SIMULA 67 是首批实现 Hoare 所提出的许多特性的语言之一。其他实现部分提议特性的语言包括 IBM PL/I、ALGOL 68,以及几年后的 1970-1971 年间的 Pascal。

    关键字 "new" 此前已被 Niklaus Wirth 首次使用,但在 Wirth 那里,它的含义与 Hoare 的不同。它用于声明一个变量 […]

  2. OskarS

    > 不仅如此,mfree() 还会接收它正在释放的对象的 size,这才是它该有的样子。

    我一直认为这是这个行业历史上最大的微小失误之一。这意味着,你迫使内存分配器去追踪这些大小,而它本不该这么做。几乎没有任何合理的场景下,调用 free() 的人不知道分配的大小,所以现在我们在“用户空间”和内存分配器内部双重维护这些账目。想想你调用 malloc 的场景:

    * 分配单个 T 类型对象时,大小就是 `sizeof(T)`,你可以直接把那个传给 free()

    * 分配对象数组时,大小是 `count * sizeof(T)`,我想不出任何一次你不知道 `count` 的情况。它要么是静态大小的(那就是个常量),要么如果你有一个动态增长的数组,你需要追踪预留空间以知道何时重新分配。退一步说,你也需要它来做边界检查。

    * 对于原始内存块,你也应该知道在释放时你分配的原始内存大小,原因同上。就像,手里只拿着一个没有大小信息的原始 char* 指针,这简直是糟糕透顶的 C 语言实践。

    如果你真的不知道分配的大小(很难想象这种情况何时会发生),你应该被迫在用户端以某种方式追踪它,而不是委托 […]

  3. veltas

    我在这一点上不太认同作者,因为我对 'arena allocators' 并不狂热,我也不太在意 free 没有接收 size。我觉得这个接口本来就没问题。

    另外,'arena allocators'(这个词 20 年前意思还不一样,我觉得只是重新包装了一下)也没那么好,它们让某些事情变简单了,有时能提升性能,但如果使用不当,也容易导致内存占用更多和碎片化。这是我们逐渐远离旧式线性分配器的众多原因之一,也是因为我们只是想要一个简单灵活的接口来隐藏复杂性。

  4. fjfaase

    Linux 中的 sbrk 系统调用仍然可用,用于从操作系统获取更多堆内存。所以,内存仍然是以线性方式分配的,并且永远不会被释放。也许现在像 mmap 这样的函数改变了这一点。我曾经用 sbrk 为一个非常精简的标准库实现来编写 malloc。

  5. mac3n

    isn't `arena` 只是 `area` 的拼写错误吗?

同日更多故事

2026-11-04