slub_theory
Last updated
Was this helpful?
Last updated
Was this helpful?
linux kernel的小内存(8K大小以下)分配使用slab分配器, 不过由于历史原因, 此处的slab分配器是对小内存分配器的统称。
slab分配器有slab, slub, slob算法,从某一个linux kernel版本后,默认使用slub算法。
本文研究linux2.6.34版本的内存管理子系统,基于slub算法的slab分配器(也叫 slub分配器), slub分配器从buddy分配器分配得到的内存叫作slab,一个slab可能有1 page,也可能 有2 page等等,然后将一个slab分成若干等分大小相同的小内存,这些小内存叫作object
申请object时,可以分成4种情况,如下:
第一情况:当slub系统刚刚创建完成时,此时没有分配任何slab,第一次进行申请object
从buddy分配器申请新slab,然后将page
变量指向新slab的第一个object,并且将第一个空闲的object返回,最后freelist
变量指向下一个空闲的object
第二种情况:kmem_cache_cpu
结构体的page
变量指向的slab有空闲object
将freelist
变量指向的第一个空闲的object返回,然后将freelist
变量指向下一个空闲的object
第三种情况:kmem_cache_cpu
结构体的page
变量指向的slab没有空闲object,但是kmem_cache_node
结构体的partial
链表指向的slab有空闲object
先将page
变量指向的slab移动到full
链表,然后再把partial
链表指向的slab的第一个空闲object返回,同时将freelist
变量指向下一个空闲的object
第四种情况:kmem_cache_cpu
结构体的page
变量指向的slab没有空闲object,kmem_cache_node
结构体的partial
链表指向的slab也没有空闲object,只能向buddy分配器申请新slab
先将page
变量指向的slab移动到full
链表,然后从buddy分配器申请新slab,并且将第一个空闲的object返回,同时将freelist
变量指向下一个空闲的object
释放object时,可以分成4种情况,如下:
第一种情况:释放的object属于kmem_cache_cpu
结核体的page
变量指向的slab
直接把object释放到对应的slab中
第二种情况:释放的object属于kmem_cache_node
结构体的full
链表指向的slab
先把object释放到对应的slab中,再把此slab移动到partial
链表中
第三种情况:释放的object属于kmem_cache_node
结构体的partial
链表指向的slab,但是释放后,partial
链表指向的slab不为空
直接把object释放到对应的slab中
第四种情况:释放的object属于kmem_cache_node
结构体的partial
链表指向的slab,但是释放后,partial
链表指向的slab为空
先把object释放到对应的slab中,再把此slab从partial
链表中删除,最后释放此slab