Cache映射

在Cache设计中,另一个问题是高速缓存行应该存储在什么位置。当从主存中取出一个高速缓存行时,应该把这个高速缓存行放置到Cache中的什么位置? 这个问题的答案因系统而异。一个极端是全相联(fully associative) Cache,每个高速缓存行能够放置在Cache中的任意位置。另一个极端是直接映射(directed mapped) Cache,每个高速缓存行在Cache中有唯一的位置。处于两种极端中间的方案是n路组相联(nway set associated)。在n路组相联Cache中,每个高速缓存行都能放置到Cache中n个不同区域位置中的一个。 例如,在2路组相联Cache中,每个高速缓存行可以映射到2个位置中的一个。

假设主存有16行,分别用0~15标记,Cache有4行,用0~3标记。在全相联映射中,主存中的0号行能够映射到Cache中的0、1、2、3任意一行。在直接映射Cache中,可以根据主存中高速缓存行的标记值除以4求余,获得在Cache中的索引。因此主存中0、4、8号行会映射到Cache的0号行,主存中的1、5、9号行映射到Cache的1号行,以此类推。在2路组相联Cache中,将Cache分成两组,0号行和1号行构成一个组,称为0号组;2号行和3号行构成另一个组,称为1号组。 根据主存中行的标记对2取模从而获得Cache中组的索引号。主存的0号行可以映射到Cache中第0组中的0号行或者1号行。详见表2-1。

Cache映射
 

当内存中的行(多于一行)能被映射到Cache中的多个不同位置(全相联和n路组相联)时,需要决定替换或者驱逐Cache中的哪一行。在前面的2路组相联的例子中,假设主存中的0号行已存储在Cache 的0号行,主存中的2号行已存储在Cache的1号行,那么主存的4号行应该存储在哪里呢?最常用的替换方案是最近最少使用(least recently used)。顾名思义,21Cache记录各个块被访问的次数,替换最近访问次数最少的块。如果近来主存的0号行比2号行访问的更多,那么2号行在就会被替换出Cache,它在原来Cache的位置就被替换成用来存储4号主存行。

你可能感兴趣的:(cache)