直接映射详解

在cache中为主存中每个字分配一个位置的最简单方法就是根据这个字的主存地址进行分配,这种cache结构称为直接映射。其中,每个存储器地址对应到cache中一个确定的地址

直接映射cache都采用以下映射方法:

i=j mod C,其中,i为Cache块地址,j为主存块地址,C为Cache中的块数,mod表示求余运算。


直接映射详解_第1张图片

  • 上图中Cache的块数为8,又块数是2的幂,取模计算就很简单,只需要取地址的低log2(8)位即块地址中最低的三位,例如存储器地址(00001)2被映射到(001)2的位置,(11101)2被映射到(101)2的位置。

标记:由于cache中每个位置可能对应于存储器中多个位置,因此需要引入一组标记,标记中包含了地址信息。标记只需包含地址的高位,也就是没有用来检索cache的那些位。如上图标记位只需使用5位地址中的高两位。

有效位:我们还需要一种方法来判断cache块中确实没有包含有效信息。例如,当一个处理器启动时,cache中没有数据,标记域中的值就没有意义,甚至在执行了一些指令后,cache中的一些块依然为空。因此需要增加一个有效位来标识一个块是否含有一个有效地址。

直接映射详解_第2张图片

  • 上图给出了一个使用32位地址,1024字的cache。由于cache有1024个字,即需要10位索引2^10。又有2位是字节偏移信息,剩下的32-10-2=20位用来和标记比较。如果标记和地址的高20位相等,并且有效位开启,那么请求在cache命中。

直接映射详解_第3张图片

上图给出了直接映射的完整结构图

直接映射是最简单的地址映射方式,它的硬件简单,成本低,地址变换速度快,而且不涉及替换算法问题。但是这种方式不够灵活,Cache的存储空间得不到充分利用,每个主存块只有一个固定位置可存放,容易产生冲突,使Cache效率下降,因此只适合大容量Cache采用。例如,如果一个程序需要重复引用主存中第0块与第2^c块,最好将主存第0块与第2^c块同时复制到Cache中,但由于它们都只能复制到Cache的第0块中去,即使Cache中别的存储空间空着也不能占用,因此这两个块会不断地交替装入Cache中,导致命中率降低。


你可能感兴趣的:(直接映射详解)