Linux2.6为数据结构分配内存slab

1.高速缓存描述符、slab描述符、数据结构对象之间的关系


slab描述符也可以在外面

不管slab描述符在哪里,空闲链接数组紧跟在slab描述符后面

第一张图跟2.6的不太一样,2.6中,所有箭头都是双向的,且没有不同各种类slab描述符的链接


建立一个缓冲的专用队列:

1.从cache_cache中分配一个kmem_cache_t结构的高速缓存描述符

2.进行一系列计算,以确定最佳的slab构成

3.设置各种参数

4.将kmem_cache_t结构链入cache_cache的next队列中


利用这个专用队列来为这个专用的数据结构分配空间

1.找到第一个含有空闲对象的slab

若找到,则分配一个空闲对象给数据结构

若未找到,则扩充该slab队列


扩充slab队列

1.计算下一块slab应有的着色区大小

2.分配若干连续的物理页面

3.建立slab的管理信息

4.设置用于具体对象的页面

5.将页面构造成slab

6.链入给定的slab队列


建立slab的管理信息

1.大对象--->分配一个slab_t

   小对象--->留出一部分空间作为slab_t

2.向slab_t写入管理信息


释放一个数据结构对象

1.找到对象所在的slab

2.计算对象在链接数组中的编号

3.释放对象(只是修改数组指针)


真正的页面内存的释放,由kswapd定期地调用kmem_cache_reap来完成


普通高速缓存的管理类似于伙伴系统


同一数据结构可以有几个slab,组成一个slab队列。

同一数据结构由于大小相同,不同slab队列的对象很可能会映射到同一高速缓存行中。

为了提高命中率,同一数据结构的不同slab有不同的着色区,使它们能映射不同行中


原文地址:https://www.cnblogs.com/windmissing/p/2559829.html