版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/liuhangtiant/article/details/81612646
freelist是干嘛的?
我们前面提到过freelist,只不过仅仅提到了freelist可以放在slab内部也可以放在slab外部,并没有提到freelist的具体作用。我们今天就来剖析一下freelist的作用。
freelist的作用其实非常非常简单,就是记录slab中没有使用的object。这里有几个注意点:
- freelist实际上是一个数组,数组中存放未使用的object的index值。
- page->active用于记录哪些object index是空闲的,freelist索引0-page->active记录内容无效,索引page->active往后是空闲的object index。
上面提到的已分配并不一定是被用户使用,也可能是被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。