本文装载自 嵌入式Linux中文站
slab分配器:解决内部碎片问题
内核通常依赖于对小对象的分配,它们会在系统生命周期内进行无数次分配。slab缓存分配器通过对类似大小(远小于1page)的对象进行缓存而提供这种功能,从而避免了常见的内部碎片问题。此处暂贴一图,关于其原理,常见参考文献3。很显然,slab机制是基于buddy算法的,前者是对后者的细化。
4.页面回收/侧重机制
关于页面的使用 在之前的一些文章中,我们了解到linux内核会在很多情况下分配页面。 1、内核代码可能调用alloc_pages之类的函数,从管理物理页面的伙伴系统(管理区zone上的free_area空闲链表)上直接分配页面(见《linux内核内存管理浅析》)。比如:驱动程序可能用这种方式来分配缓存;创建进程时,内核也是通过这种方式分配连续的两个页面,作为进程的thread_info结构和内核栈;等等。从伙伴系统分配页面是最基本的页面分配方式,其他的内存分配都是基于这种方式的; 2、内核中的很多对象都是用slab机制来管理的(见《linuxslub分配器浅析》)。slab就相当于对象池,它将页面“格式化”成“对象”,存放在池中供人使用。当slab中的对象不足时,slab机制会自动从伙伴系统中分配页面,并“格式化”成新的对象; 3、磁盘高速缓存(见《linux内核文件读写浅析》)。读写文件时,页面被从伙伴系统分配并用于磁盘高速缓存,然后磁盘上的文件数据被载入到对应的磁盘高速缓存页面中; 4、内存映射。这里所谓的内存映射实际上是指将内存页面映射到用户空间,供用户进程使用。进程的task_struct- |