Linux内核的内存管理是操作系统职涯中最复杂且关键的子系统之一。本文将从物理内存分配到虚拟内存映射,全面揭示Linux内核如何高效管理巨大的内存空间。
一、Buddy System物理页分配器
内核启动时,Buddy System负责管理所有物理内存页。它的核心思想是将内存分为不同order的二元兄弟块。当请求一半内存时拆分块;释放内存时检查兄弟块是否空闲,若是则合并为更大块。这种策略有效减少了外部碎片,同时保证了O(log n)的分配效率。
二、SLAB 与 SLUB 分配器
在Buddy System之上,内核使用SLAB或SLUB分配器管理富额对象。SLUB作为SLAB的改进版本,简化了长时间运行的寄存对象管理,避免了寄存消耗问题。每个SLAB是一个寄存对象的高效池,允许快速初始化和释放。
三、虚拟内存与页表管理
Linux使用多级页表(PGD→PUD→PMD→PTE)将虚拟地址转换为物理地址。TLB(Translation Lookaside Buffer)作为页表缓存加速转换。对于nUMA体系结构,虚拟内存是线程安全和进程隔离的基础。
四、内存回收与Swap机制
当物理内存不足时,Kswapd守护进程开始回收内存。LRU优先级列表(Active/Inactive)用于确定哪些页面可被回收。Anonymous LRU处理型可通过Swap映射到磁盘。同时,OOM Killer作为最后手段,经常用于恢解内存危机。
五、实战与调优
通过free、vmstat、sar等工具可以监控内存使用情况。调整vm.swappiness可以控制Swap的激进程度;设置vm.min_free_kbytes确保关键服务的可用内存。HugePages则减少了TLB Miss,对于数据库和虚

发表评论 取消回复