三:slab分配器

目录

slab分配器

基本概念

slab分配内存

主要结构体

kmem_cache

per cpu freelist


slab分配器

基本概念

针对小粒度内存分配

伙伴系统以页4kb为最小分配单位,但对于一些时候,这太大了,会造成严重的内存浪费,产生大量内存碎片。

对于伙伴系统和slab分配器,就好比“批发商”和“零售商”,“批发商”,是指按页面管理并分配内存的机制;而“零售商”,则是从“批发商”那里批发获取资源,并以字节为单位,管理和分配内存的机制。

目前有三种实现算法,分别是slab、slob,slub。并且,依据它们各自的分配算法,在适用性方面会有一定的侧重。

基于伙伴分配器获得连续的pages,作为某数据结构对象的缓存,再将这段连续的pages从内部切割成一个个对齐的对象,使用时从中取用,这样一段连续的page我们称为一个slab。

每个高速缓存(kmem_cache)由多个slab组成,每个slab由一个或多个物理上连续的页组成。

三:slab分配器_第1张图片

当内核请求对象内存时,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的结构体。可以称作是本地缓存池。

你可能感兴趣的:(Linux子系统-内存管理,arm,嵌入式硬件,系统架构,面试,linux)