内存管理是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。

点赞(0) 打赏

评论列表 共有 0 条评论

暂无评论
立即
投稿

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部