前言
上次介绍了存储器在计算机内的层次结构以及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存储器的命中率会下降
期待下次更新❤