<\![CDATA[

引言

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

Per-CPU 页面缓存 (PCP)

为了缓解 Buddy System 的全局 zone-

点赞(0) 打赏

评论列表 共有 0 条评论

暂无评论