三、cache和内存的关联方式(associativity)
根据cache和内存之间的映射关系的不同,cache可以分为三类:一类是全关联cache(full associative cache),一种是直接关联cache(direct mapped cache),还有一种是N路关联cache(N-ways associative cache).
1.全相联型cache
顾名思义,全相联型cache的特点就是cache内的任何一个cache line都可以映射到内存的任何一处地方,这使得全关联cache的命中率是最高的,但是CPU要想访问和内存相互映射的cache不得不把内存地址与大量的cache标志(tag)
进行比较匹配,这使得效率下降,而且对于cache,其内部电路十分复杂,因此只有容量很小的cache才会设计成全关联型的(如一些INTEL处理器中的TLB Cache).对于全关联方式,内存地址的解析方式如下图所示:
可以看到内存地址只解析成tag和offset两个域,其中tag是和cache line对应的整个物理地址,而offset即是该内存单元在cache line中的偏移。
2.直接相联型cache
设一个cache中总共存在N个cache line,那么内存被分成N等分,其中每一等分对应一个cache line,需要注意的是这里所说的1等分只是大小上的一等分,在内存上并不是完全连续的。具体的来说,假设cache的大小事4M,而一个cache line的大小是64B,那么就一共有4M/64B=65536个cache line,那么对应我们的内存,0x00000000~0x00000000+64B, 0x00000000+4M~0x00000000+4M+64B, ……,就这样被分为很多个区段,对于一个确定的cache line,如第0个,那么在这么多区段中只有一个区段能被映射进去,没有被映射进去的区段不能占用其他的cache line,这样就势必导致cache的命中率下降,所以直接关联是一种很''死''的映射方法,它的命中率是最低的,但是其实现方式最为简单,匹配速度也最快。对于直接关联方式,内存地址的解析如下图所示
该图在前篇文章中出现过,在前文中提到过cache set可以包含一个或多个cache line,那么对于直接关联cache,cache set就是一个cache line,在刚才说到的4M/64B的cache例子中,offset的长度为6位(bit 0~bit 5),cache set的长度为16位(bit 6~bit 21),用cache set域即可直接定位对应的cache line的位置。
3.N路相联型cache
N路相连cache是前两种cache的折中形式,在这种方式下,内存同样被分为很多区域,一个区域的大小为N个cache line的大小,一个区域映射到对应的N个连续的cache line,并且该区域内的单元可以映射到N个cache line中的任意一个。假设一个4-路相联cache,其大小为64M,一个cache line的大小为16K,那么总共有64M/16K=16384个cache line,但是在4-路相联的情况下,我们并不是简简单单拥有16384个cache line,而是拥有了16384/4=4096个区域(sets),每个区域有4个cache line.一个内存单元可以缓存到它所对应的set中的任意一个cache line中去。对于内存地址的解析,N路相联型和直接相联型在结构上是一样的,但是因为N路相联型的cache中的cache set有N个cache line,所以在通过内存地址单元的cache set域确定相应的set外,还要通过tag域来确定对应的cache line.
细心的朋友应该已经发现了,实际上直接相联型cache和全相联型cache只是N路相联型cache的特殊情况,当N为1时,1-路相联型cache即为直接相联型cache.而当N值和cache line的总数相等时,整个cache即为一个set,成为全相联型cache。下面再给出直接相联型cache和全相联型cache与内存的映射关系图。
注:图中的Index即为cache set
由于个人水平有限,文中描述不当或出错之处还请指出,转载请注明出处,谢谢http://blog.youkuaiyun.com/vanbreaker/article/details/7475093。