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