cache存储器(随笔Ⅱ)

前言

  上次介绍了存储器在计算机内的层次结构以及cache本身的原理,详细见”cache存储器(随笔Ⅰ)”。

  接下来将会介绍cache存储器与主存直接的数据映射关系。

  由于cache存储器的行比主存储器的块要少得多,因此需要一定的算法来实现映射。目前常用的三种方法:直接映射、全相联映射、组相联映射。 

  

直接映射

  将主存中的每个块映射到一个固定可用的cache存储器的行中,可以表示为

i = j mod m

  其中,i是cache存储器行号,j是主存的块号,m是cache存储器的行数。

  简单地说,就是主存中的0、m、2m····等块号均单一映射到cache存储器的0行,主存中1、m+1、2m+1···等块号均单一映射到cache存储器的1行,····,以此类推,如下表所示。

cache行 被分配的主存块
0 0、m、2m、···、2s-m
1 1、m+1、2m+1、···、2s-m+1
··· ···
m-1 m-1、2m-1、3m-1、···、2s-1

 

  下图为直接映射的机制图

 

  从图中看可以看出,每一个访问cache存储器的的主存地址都可以看成是三部分组成的,长度为s + w:

    • 最低的w位标识主存某个块中唯一的一个字或者字节
    • 剩余的s位中指定了主存2s个块中的一个
    • 剩余s位的前s - r位为cache存储器的标识符
    • 剩余s位的后r位位cache存储器的行号,即cache存储器共有m = 2r

  根据上图则有如下直接映射小结:

    • 地址长度:s+w位
    • 寻址单位数:2(s+w)字或字节
    • 块大小(行长度):2w字或字节
    • 主存块数:2s
    • Cache行数:2r
    • 标识长度:(s - r)位

 

实例

  我们将设计一个范例来展示如何映射。首先,需要设定以下简单条件:

    • cache存储器的行以及主存的块长为4字节
    • cache存储器共16行,主存共64块
    • 主存地址共8位

  可以推出s = 6、w = 2、r = 4,则主存地址如下图所示

  接下来可以由高s位中的低r位来寻找cache存储器行号,即0010,如下图所示

   通过高s位中的高s - r位来确定cache存储器的标识符,记录是哪一块主存,即10,如下图所示

总结

  • 技术简单
  • 实现花费成本低
  • 对于任意给定主存的块,其cache存储器映射位置是固定的,因此会有抖动现象:如果一个程序频繁访问两个映射到同一cache存储器行的不同主存块的字的话,这两个块会被不断地交换到cache存储器中,cache存储器的命中率会下降

  期待下次更新❤

 

posted @ 2021-07-09 19:45  程序小喵  阅读(367)  评论(0编辑  收藏  举报