引言
Linux 内核的内存管理子系统是整个操作系统的基石。它不仅负责物理页面的分配与回收,还通过复杂的层次结构为内核对象、用户空间进程、页面缓存等提供高效且安全的内存服务。本文将从 Buddy System 开始,逐步深入 SLAB/SLUB 分配器、虚拟内存映射、页面回收机制与 OOM Killer,最后给出生产环境下的观测与调优实战指南。
全局视野:Linux 内存管理架构总览
物理内存三大层次
Linux 物理内存管理分为三层:(1)Buddy System(伙伴系统)管理物理页面,解决外部碎片问题;(2)SLAB/SLUB/SLOB 分配器在 Buddy System 之上,为小至几十字节的结构体提供高效分配;(3)vmalloc 区域提供虚拟连续但物理不一定连续的内存映射。三层分工明确,满足了从页面级到字节级的全方位分配需求。
虚拟内存四层模型
从 4.14 内核开始,x86_64 采用四级页表(PGD→PUD→PMD→PTE),5.12 五级页表(添加 P4D 层)在部分平台启用。进程的 mm_struct 通过 VMA(Virtual Memory Area)红黑树管理各段映射,vm_area_struct 记录每个 VMA 的起止地址、权限、文件后备等信息。
Buddy System:页面级分配器
核心算法
Buddy System 将所有物理页面按 order(2^n 个连续页面)组织为 11 个 free_area 链表(order 0~10,对应 4KB~4MB)。分配 order-n 页面时,若该 order 链表为空,则从更高阶链表分裂;释放时,若相邻的同 order 页面(buddy)也为空闲,则向上合并至 order-(n 1)。这种合并-分裂机制从根本上消除了外部碎片,仅可能在分配大于请求 2^n 页面时产生内部碎片。
Zone 与水位线
x86_64 平台的内存 Zone 包括 ZONE_DMA(0-16MB)、ZONE_DMA32(16MB-4GB)、ZONE_NORMAL(高端直接映射区)。每个 Zone 维护三个水位线(mark_min、mark_low、mark_high),当空闲页面低于 pages_low时启动异步回收(kswapd),低于 pages_min 则同步回收(direct reclaim)。合理设置水位线是避免性能抖动的第一步。
Per-CPU 页面缓存 (PCP)
为了缓解 Buddy System 的全局 zone-

发表评论 取消回复