前一篇blog linux内核内存分配(一、基本概念)主要是分析linux内核内存的分配和物理页分配函数接口。但是在实际的操作中,不一定所有内存申请都需要一个物理页,很多只是需要分配几K大小的内存就可以。所以就需要更小的内存分配函数。刚开始看这个有点不懂,不过懂了就很简单了。哈哈。
slab思想
摘抄《深入linux设备驱动程序内核机制》的一段话:slab分配器的基本思想是,先利用页面分配器分配出单个或者一组连续的物理页面,然后在此基础上将整块页面分割成多个相等的小内存单元,以满足小内存空间分配的需要。当然,为了有效的管理这些小的内存单元并保证极高的内存使用速度和效率。
slab分配器结构
首先看下一张图,这是一张非常经典的图(所以也是从别的地方截取过来的,哈哈)基本上讲slab的都会上这张图(有些图可能会有点点不同,不过都是大同小异)
这是有struct kmem_cache 和 struct slab构成的slab分配器;
从大方向来说,每个kmem_cache都是链接在一起形成一个全局的双向链表,由cache指向该链表,系统可以从Cache_chain开始扫描每个kmem_cache,来找到一个大小最合适的kmem_cache,然后从该kmem_cache中分配一个对象;
其中每个kmem_cache(有的地方也会叫这个kmem_cache为cache,原因是kmem_cache中的object有大有小(其实也是kmem_cache有大有小),当内存申请时,会有命中该kmem_cache的说法,和CPU中的cache命中是类似的意思,所以也会叫kmem_cache为cache(个人理解))有三条链表,slabs_full 表示该链表中每个slab的object对象都已经分配完了;slabs_partial 表示该链表中的slab的object对象部分分配完了;slabs_empty 表示该链表中的object对象全部没有分配出去;
其中每个