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 ……,如下图:
pa