Transcript slab

Slab分配器(续)

小组成员:
代志华
陈慧
郭峰
主要内容

Slab分配器的简单回顾
 “Slab着色”的原理
Slab、缓存与对象
slab
对象
对象
Cache
对象
slab
对象
Slab分配器把对象分组放进高速缓存。每个高速缓存都
存放着同一种类型的对象。
包含高速缓存的主内存区被划分为多个slab,每个slab
由一个或多个连续的页框组成。
描述符
每个高速缓存都是由struct kmem_cache_s类型的一个表来
描述的。
高速缓存中的每个slab都有自己的类型为struct
kmem_slab_s的描述符。
每个对象都有类型为struck kmem_bufctl_s的一个描述符。
高速缓存描述符与Slab描述符
高速缓存描述符
高速缓存描述符
高速缓存描述符
c_freep
Slab描述符
s_nextp
Slab描述符
Slab描述符
Slab描述符
Slab描述符
s_prevp
Slab描述符
Slab描述符
Slab内部的两种结构

Slab描述符存放在Slab内部,针对于小对
象
 Slab描述符存放在Slab外部,针对于大对
象
Slab描述符在Slab内部时的结构图
Slab描述符
空闲联结数组
空闲的 已分配的 已分配的 空闲的
对
对象
对象
对象
着色区
着色补偿区
Slab描述符在Slab以外

Slab描述符被插在专门存放Slab描述符的
专用cache中,该专用cache的描述符由本
cache描述符中的slabp_cache指向。
某个
Slab描述符
在slab以外
存放
的cache1
cache1的描述符
Cache描述符
……
Slabp_cache
……
专门存放
Slab描述符
的cache
所有专用cache的cache描述符都
存放在专门存放cache描述符的
cache中,也就是说专门有个
cache,它里面存放的对象全是
cache描述符。
关于Slab的着色区

关于CPU的高速缓存

在Slab中设置着色区的必要性

在Slab中设置着色区的可能性

在Slab中设置着色区的方法
关于CPU的高速缓存

其本质上是一块硬件内存. 这个CACHE
被划分成许多部分,每部分16字节或者
32字节(或其它),它和一般内存(L2
CACHE)交互一次需要至少读/写这样一
个部分,这个部分被称为cache line.

一般的CACHE命中测试计算方法是
cache location = address % cache_size

CACHE相当于一块小的内存,它会与一
般物理内存交互。它和内存交互一般一
次传输32个字节,也就是: CACHE 字节
0-31一次写到/读取物理内存 ,字节32-63
一次写到/读取物理内存....

另外,cache写到物理内存的位置不是任
意的,如果我们假设CPU的CACHE的大
小为32K,那么:CACHE中地址0的位置
只能和物理内存地址0, 32K, 64K交互;
CACHE中地址1的位置只能和物理内存
的地址1, 32K+1,64K+1交互。。。
Linux采取的策略
一般结构都是cache line对齐的,在这里
就是32个字节对齐。
 把结构中的重要字段安排在最初的cache
line中。


假设对象A的一个字段长为32个字节,如
果它放在物理地址0-31,那么它将和
CACHE中的第一个cache line 交互,如果
放在物理地址20-51,那么如果CPU要访问
这个字段,必须将第一个和第二个cache
line都读入,才能获得这个字段的信息,
显然这样速度慢,所以一般字段需要
cache line对齐,在这里就是32个字节对
齐。
在Slab中设置着色区的必要性

若同一cache中的slab均没有设置着色区,
由于在slab中每个结构都是对齐的,如果
存在两个slab,slabA和slabB,他们的首
地址在物理内存中相差32K的整数倍的话,
那么他们中的对应的每个对象在CPU中
的高速缓存中占据的是同一位置,这样
势必会影响高速缓存的命中率,降低运
行速度。
举例说明其产生的问题

前提:
CPU的高速缓存为32K
CPU的cache line 大小为32个字节
举例说明其产生的问题
有两个对象A,B,其大小均为64字节,
且前32个字节访问的频繁一些。假设对
象A位于物理内存0~63字节处,而对象B
恰好位于物理内存32K~32K+63字节处。
也就说对象A在CPU高速缓存中所占的两
根cache line 恰好同对象B在CPU高速缓
存中所占的两根cache line 重合。其示意
图如下:
CPU高速缓存
对象A
对象B
举例说明其产生的问题
我们假定内核访问A后就访问B,再访问A,交
错进行,并且前32个字节次数都是50次,
后32个为10次 。在这种情况下,CPU需要
访问内存50+50+10+10 = 120次。
举例说明其产生的问题
如果对象A在物理内存中的位置不变,而对
象B在物理内存中的位置向后移动32个字节
(也就是一条Cache line 的大小),那么现
在对象A在CPU高速缓存中所占的第二根
Cache line同对象B在CPU高速缓存中所占
的第一根Cache line重合。其示意图如下:
CPU高速缓存
对象A
对象B
举例说明其产生的问题

我们仍然假定内核访问A后就访问B,再访
问A,交错进行,并且前32个字节次数都
是50次,后32个为10次 。
在Slab中设置着色区的可能性
由于Slab是从兄弟算法中申请的空闲连续
页面的,所以申请的最小单位是“页”,
也就是4K。
 假设申请了page_num页既page_num*4K
的空间,每个对象大小为obj_size个字节,
Slab管理区的大小为m_size。这每个Slab
中有空闲空间free =(page-num*4K- msize)% obj_size。

在Slab中设置着色区的方法
当创建一个新的cache时,置color_offset
为0。
 每创建一个新的Slab,其开头位置空闲
color_offset个字节。然后color_offset =
color_offset + cache line如果color_offset >
free,则color_offset = 0
