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有不同的着色区,使它们能映射不同行中

results matching ""

    No results matching ""