目录
slab分配器
基本概念
slab分配内存
主要结构体
kmem_cache
per cpu freelist
slab分配器
基本概念
针对小粒度内存分配
伙伴系统以页4kb为最小分配单位,但对于一些时候,这太大了,会造成严重的内存浪费,产生大量内存碎片。
对于伙伴系统和slab分配器,就好比“批发商”和“零售商”,“批发商”,是指按页面管理并分配内存的机制;而“零售商”,则是从“批发商”那里批发获取资源,并以字节为单位,管理和分配内存的机制。
目前有三种实现算法,分别是slab、slob,slub。并且,依据它们各自的分配算法,在适用性方面会有一定的侧重。
基于伙伴分配器获得连续的pages,作为某数据结构对象的缓存,再将这段连续的pages从内部切割成一个个对齐的对象,使用时从中取用,这样一段连续的page我们称为一个slab。
每个高速缓存(kmem_cache)由多个slab组成,每个slab由一个或多个物理上连续的页组成。
当内核请求对象内存时,slab 分配器可以返回刚好表示对象的所需内存。
slab分配内存
当使用kmem_cache_alloc()申请内存的时候,优先从本地cpu的slab缓存池申请。如果没有可用对象,从公用per node partial中分配,如果也没有可用对象的话,就只能从伙伴系统分配一个slab了,并挂入per cpu freelist。
slab释放内存
过于复杂,暂时放置
主要结构体
kmem_cache
使用kmem_cache_create()接口创建kmem_cache
结构描述的一段内存就称作一个slab缓存池。一个slab缓存池就像是一箱牛奶,一箱牛奶中有很多瓶牛奶,每瓶牛奶就是一个object。分配内存的时候,就相当于从牛奶箱中拿一瓶。总有拿完的一天。当箱子空的时候,你就需要去超市再买一箱回来。超市就相当于partial链表,超市存储着很多箱牛奶。如果超市也卖完了,自然就要从厂家进货,然后出售给你。厂家就相当于伙伴系统。
per cpu freelist
每一个cpu都会分配一个struct kmem_cacche_cpu的结构体。可以称作是本地缓存池。