高速缓存Cache的映射方式

一:直接映射

简单来说,就是整个Cache,映射到主存中,是一个主存块组(n个连续主存块为一组)

地址划分:主存组号,Cache行数,块内地址(按顺序排列的)

Ps:这里说的地址已经是物理地址,不是程序中的逻辑地址,可参考CPU访问地址的过程

主存组号:主存块号从0开始,顺序,每n块为一组,从第0组开始

Cache行数:表示在Cache块的第几行数据,也表示在主存块组中的第几块

块内地址:CPU一次取一字(若干字节,不同计算机可能会不同)的数据

而一个主存块可能包含多个字,块内地址则表示要取块内的第几字

来一个例子帮助理解:
高速缓存Cache的映射方式_第1张图片
(1)
主存地址空间:1GB=2^30B

则主存地址为20位,才够访问这么多的地址空间

内存块大小为128B=2^7B,以字节编址(编址的最小单元是字节)

则块内地址为低7位

64KB/128B=2^16B / 2^7B= 2^9

Cache有2^9行

Cache行数占中间9位

30-7-9=14

则主存组号占高14位

(2)
直接映射则无需控制位

全写方式下,无需修改位(若数据有更改则在Cache中修改同时修改对应主存数据)

但是仍需要标志位和有效位

标志位:对应主存组号

有效位:有效位为0表示该Cache行存的数据是无效的,会做缺失处理

则Cache总容量:

2^9x(128x8+14+1)=519.5K位

Ps:千万不要把地址和Cache每一行的结构弄混了

上面说的主存各个数位的划分,划分的是地址

Cache每一行内的结构并不是:主存组号,Cache行数,块内地址

而是标记,数据

标记位可能有控制位,修改位,有效位,标志位

数据则是取决于计算机的字长,一字大小
二:全相联映射

地址划分:标记,块内地址

直接用比较多位的标记位来直接映射主存块号(这里主存块不分组,就是从0开始到第几块)

三:组相联映射

地址划分:标记,Cache组号,块内地址

这里是将主存块和Cache行都进行了分组(n个cache行分到一组)

然后,每个主存块可以映射到一个Cache组内的任意行

Ps:替换时不是像直接映射那样整个Cache去替换,而是要用哪块替换哪块
地址划分的“标记”指的是主存组号

访问过程:根据主存地址中的标记找到对应主存块组

根据Cahce组号找到对应Cache组和当前主存块组内的对应主存块

用当前主存块,逐行比较组内的各Cache行,若命中则命中

若无则做Cache缺失处理

你可能感兴趣的:(操作系统,操作系统)