Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1319714
  • 博文数量: 482
  • 博客积分: 13297
  • 博客等级: 上将
  • 技术积分: 2890
  • 用 户 组: 普通用户
  • 注册时间: 2009-10-12 16:25
文章分类

全部博文(482)

文章存档

2012年(9)

2011年(407)

2010年(66)

分类: LINUX

2011-04-02 15:52:44

看过ULK,LDDkernel代码后对内存管理的理解加深了不少,但还有一点一直不甚明了,SLAB里面的着色(color)一直不知道什么原理关键对CPU CACHE 理解不对.

今天仔细搜了搜终于明白一点儿:

 

比如cache line 32 字节,  字节0-31一次从内存写入/读取字节32-63一次从内存写入/读取…..

 

另外cache对应到内存位置不是任意的

Cache 地址对应到 内存地址0 , 32 ,64 ….

Cache 地址对应到 内存地址1 , 33 ,65 ….

 

一个slab大小肯定是整数页,所以起始地址末12位为零即都于cache0 对应.

然后2slab的每一个obj大小一样所以2slab每个obj都对应相同的cache line.

这样2个位置相同的obj都要频繁访问,比较容易使cache来回刷新,效率降低.

 

着色就是在第二个slab的起始位置空一个cache line出来这样2slab每个obj对应的cache错开一个这样2个位置相同的obj即使频繁访问,也不会用一个相同cache line.

 

但是这种方法也是有限的, 2slab里面的obj对象的访问比较随即,不能保证哪两个在一个cache line 


 
一个L1 DATA CACHE相当于一块小的内存,我们假设它为16K大,它会与一般物理内存交互。 
它和内存交互一般一次传输16个字节(32个字节),也就是: 


CACHE 字节0-15一次写到/读取物理内存 ,字节16-31一次写到/读取物理内存.32-47 ... ... 

这些一次被传输的字节被称为cache line。 

注意!!!这里的cache line中的cache指的是cpu中的L1 DATA CACHE ,而不是slab算法中的结构cache,这两个容易混淆。下面提到的cache都是指L1 DATA CACHE,而不是slab算法中的结构cache 
-------------------------------------------------------------- 

另外,cache写到物理内存的位置不是任意的, 
我们假定内存为64K,那么cache地址0的数值只能和物理内存的地址0, 16K, 32K交互;cache地址1的数值只能和物理内存的地址1, 16K+1, 32K+1交互 
。。。 。。。cache地址16K-1的数值只能和物理内存的地址6K-1, 16K+16K-1, 32K+16K -1交互 

这说明了两点: 

(1)假设对象A的一个字段长为16个字节,如果它放在物理地址 0-15,那么它将和cache的第一个cache line 交互,如果放在物理地址 8-23,那么 
如果CPU要访问这个字段,必须将第一个和第二个cache line 都读入,才能获得这个字段的信息,显然这样速度慢,所以一般字段需要cache line对齐, 
在这里就是16个字节对齐。 


(2)关于colour 


一般一个对象某些字段访问频繁些。 
假定一个cache(这个cache指slab的cache,不是上面提到CPU的L1 DATA CACHE)占用5个页面也就是20K. 
假定其中对象大小为32个字节,前16个字节访问频繁许多。 

假定对象A起始于物理地址0,对象C起始于31,对象B起始于物理地址16K,那么对象A,对象B的前16个字节都和第一个cache line 交互,后16个字节都和第二个cache line 交互 
对象C前16个字节与第3个cache交互。 

我们假定内核访问A后就访问B,再访问A,交错进行,并且前16个字节次数都是50次,后16个为10次。C也是。 

这样第一个cache line 要交互100次,第二个20次,一共120次。 

如果让对象B向后移动16个字节,也就是对象B的前16个字节与第二个cache line 交互,后16个与第3个交互。 
那么第一个为2次,因为只有开头结尾2次要与内存交互,其它每次都在L1 DATACACHE 中写就可以了。第2个cache line为20次左右(后面的只须在CACHE中读写),第3个cache line为20次, 
3个line一共才41次,你不妨仔细模拟一下。 

所以进行错位能降低CACHE的交互次数,从而提高CPU处理速度能力。 

这个错位(也就是上面的16个字节)就是colour.

====
阅读(530) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~