文章管理 优雅的slab内存分配器(六)—— freelist

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/liuhangtiant/article/details/81612646

freelist是干嘛的?


我们前面提到过freelist,只不过仅仅提到了freelist可以放在slab内部也可以放在slab外部,并没有提到freelist的具体作用。我们今天就来剖析一下freelist的作用。

freelist的作用其实非常非常简单,就是记录slab中没有使用的object。这里有几个注意点:

  1. freelist实际上是一个数组,数组中存放未使用的object的index值。
  2. page->active用于记录哪些object index是空闲的,freelist索引0-page->active记录内容无效,索引page->active往后是空闲的object index。
  3. 上面提到的已分配并不一定是被用户使用,也可能是被cache到了array_cache中。

    下面我们采用图形辅以代码来详细说明freelist的工作机制。

Freelist功能剖析


freelist初始化

cache_grow_begin--->cache_init_objs(cachep, page)--->set_free_obj(page, i, i);

当分配slab的时候,slab中所有所有的object都是空闲的,此时freelist数组中存放的值是0,1,2,3 ……,如下图:
这里写图片描述

page->active为0,表明所有的object都是空闲的,且freelist数组所有成员都是有效的。

依次从slab中分配了5个object

slab_get_obj--->page->active++

从slab中申请object的时候,page->active会往前推进。分配了5个object之后,freelist状态如下:
这里写图片描述
freelist[0]-freelist[4]是无效的。

依次释放object index为0和object index为2的object

slab_put_obj
   |----->unsigned int objnr = obj_to_index(cachep, page, objp);
   |        根据object的地址计算object index
   |----->page->active--;
   |----->set_free_obj(page, page->active, objnr);
   |        设置freelist[page->active]=objnr

freelist状态如下:
这里写图片描述
释放了两个object之后,page->active=3,且freelist[4]=0,freelist[3]=1。

猜你喜欢

转载自blog.csdn.net/liuhangtiant/article/details/81612646