内存管理是Linux内核中最复杂且最关键的子系统之一。本文深入剖析Linux内核内存管理的三大核心机制:伙伴系统(Buddy System)、SLAB/SLUB分配器以及多级页表管理。
一、物理内存管理:伙伴系统
伙伴系统是Linux内核管理物理内存的基础算法,源自Knuth在1963年提出的思想。该算法将物理内存划分为不同的块阶(order),从0阶(单页,4KB)到10阶(4MB大页)。当内核请求内存时,伙伴系统从对应阶的空闲链表中分配一个块,如果该阶没有空闲块,则从更高阶分裂出两个"伙伴"块。
关键特性:
- 碎片控制与快速合并:相邻伙伴块可直接合并以减少外部碎片
- per-cpu cache:为每个CPU维护本地缓存,减少锁争用
- watermark机制:设置min/low/high水位线触发kswapd进行页面回收
二、内核对象分配:SLAB/SLUB分配器
伙伴系统以页为粒度分配,但内核中大量小对象(如task_struct,inode等)的分配会浪费空间。SLAB分配器在伙伴系统之上构建对象缓存,实现高效的小对象分配与释放。现代内核中SLUB是默认分配器,解决了SLAB的NUMA扩展性问题。
SLUB核心优化:
- 每CPU本地partial缓存避免全局锁竞争
- freelist使用unsigned long数组实现O(1)分配
- dynamic debugging通过SLAB(FRE)等魔术检测use-after-free
三、虚拟内存与多级页表
Linux采用四级页表架构(PG#PUD#PMD#PTE)实现64位地址空间到物理地址的映射。TLB(Translation Lookaside Buffer)作为页表缓存,对性能至关重要。内核提供了HugePage(2MB/1GB)机制减少TLB miss。
关键洞察:良好利用HugePage可将内存密集型工作负载性能提升15%至30%
四、页面回收与OOM机制
当物理内存不足时,kswapd守护进程按LRU链表扫描页面,将inactive页面换出到swap分区,通过PF_MEMALLOC预留紧急内存。如果所有回收策略无效,OOM Killer将被唤醒,基于oom_score算法选择性终止进程
总结
理解这些机制有助于系统调优和性能分析。相关工具包括free/vmstat/slabtop//proc/buddyinfo和perf mem。

发表评论 取消回复