内存管理子系统多是linux内核中最为复杂的一个子系统,其支持的功能需求众多,如页面映射、页面分配、页面回收、页面交换、冷热页面、紧急页面、页面碎片管理、页面缓存、页面统计等,并且对性能也有很高的要求。本文从内存管理硬件架构、地址空间划分和内存管理软件架构三个方面入手,尝试对内存管理的软硬件架构作一些宏观上的分析总结。linux
由于内存管理是内核最为核心的一个功能,针对内存管理性能优化,除了软件优化,硬件架构也作了不少的优化设计。下图是一个目前主流处理器上的存储器层次结构设计方案。数组
从图中能够看出,对于读写内存,硬件设计了3条优化路径。缓存
1)首先L1 cache支持虚拟地址寻址,保证CPU出来的虚拟地址(VA)不须要转换成物理地址(PA)就能够用来直接查找L1 cache,提升cache查找效率。固然用VA查找cache,有安全等缺陷,这须要CPU作一些特别的设计来进行弥补,具体能够阅读《计算机体系结构:量化研究方法》了解相关细节。安全
2)若是L1 cache没有命中,这就须要进行地址转换,把VA转换成PA。linux的内存映射管理是经过页表来实现的,可是页表是放在内存中的,若是每次地址转换过程都须要访问一次内存,其效率是十分低下的。这里CPU经过TLB硬件单元来加速地址转换。性能优化
3)得到PA后,在L2 cache中再查找缓存数据。L2 cache通常比L1 cache大一个数量级,其查找命中率也更高。若是命中得到数据,则可避免去访问内存,提升访问效率。架构
可见,为了优化内存访问效率,现代处理器引入多级cache、TLB等硬件模块(以下图是一款8核MIPS处理器硬件框图)。每一个硬件模块内部还有大量的设计细节,这里再也不深刻,若有兴趣能够阅读《计算机体系结构:量化研究方法》等书籍进一步了解。性能
根据不一样的内存使用方式和使用场景须要,内核把内存映射地址空间划分红多个部分,每一个划分空间都有本身的起止地址、分配接口和使用场景。下图是一个常见的32位地址空间划分结构(点击见大图)。优化
不一样的CPU体系架构在地址空间划分上不尽相同,但为了保证CPU体系差别对外部模块不可见,内存地址空间的分配接口的语义是一致的。atom
由于64位CPU通常都不须要高端内存(固然也能够支持),在地址空间划分上与32位CPU的差别较大,下图(大图)是一个MIPS64 CPU的内核地址空间划分示例。设计
内核内存管理的核心工做就是内存的分配回收管理,其内部分为2个体系:页管理和对象管理。页管理体系是一个两级的层次结构,对象管理体系是一个三级的层次结构,分配成本和操做对CPU cache和TLB的负面影响,从上而下逐渐升高。
除了内存分配,内存释放也是按照此层次结构操做。如释放对象,先释放到per-cpu缓存,再释放到slab缓存,最后再释放到伙伴系统。
框图中有三个主要模块,即伙伴系统、slab分配器和per-cpu(冷热)缓存。他们的对比分析以下。
--完--