物理内存管理

物理内存管理负责分配和释放物理内存,这是 malloc/free 这些虚拟内存管理机制的基础。物理内存管理有许多种机制,这篇文章描述 Wheel 中使用的算法。

Wheel 大体上参考了 Linux 的 buddy allocator,将物理内存按 2 的幂组织成不同级别的 block,分配内存的时候,会将较大的 block 分割,回收内存的时候,会与相邻同级别的空闲 block 合并,形成一个更大的 block。但是与 Linux 不同的是,我们并没有使用位图来表述各个 block 的状态,而且能够不按照 block 的边界分配/释放内存。

物理内存管理需要关心哪些问题

低碎片化。随着内核与进程频繁地分配/释放物理内存,碎片化是不断加剧的,但是 allocator 应该将碎片化程度始终维持在一个能够接受的范围之内。这样,当进程申请一段内存时,系统不会因为碎片化问题导致无法找出合适的内存范围。

速度。allocator 应该保证差不多在常数时间内实现物理内存的分配和回收,即使系统已经运行了很长时间,内存有一定程度碎片化,分配的速度也不应降低。

多核问题

多核。我们的系统应该能在多核 CPU 上运行,因此 allocator 需要能够处理多个 CPU 的并发访问。在物理层,我们不需要为每个 CPU 维护单独的 zone 结构,但是可以向每个 CPU 提供一段单页面大小的缓存。如果是申请/释放一个页面大小的物理内存,那么首先检查这个 CPU 的缓存,如果分配时缓存为空,或释放时缓存容量已满,就访问全局的页池。这样,就能有效降低分配/释放内存时对全局锁的占用情况。