一:直接映射
简单来说,就是整个Cache,映射到主存中,是一个主存块组(n个连续主存块为一组)
地址划分:主存组号,Cache行数,块内地址(按顺序排列的)
Ps:这里说的地址已经是物理地址,不是程序中的逻辑地址,可参考CPU访问地址的过程
主存组号:主存块号从0开始,顺序,每n块为一组,从第0组开始
Cache行数:表示在Cache块的第几行数据,也表示在主存块组中的第几块
块内地址:CPU一次取一字(若干字节,不同计算机可能会不同)的数据
而一个主存块可能包含多个字,块内地址则表示要取块内的第几字
来一个例子帮助理解:
(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缺失处理