写在前面
本文内容参考MOOC平台华中科技大学计算机原理课程
Cache存储系统的地址映象及变换方法
CPU工作时给出的是主存的地址,要从Cache存储器中读写信息,就要将主存地址转换为Cache存储器的地址,这种地址转换称之为地址映像。
Cache的数据结构:有效位 + 标志位 + 偏移量(块内地址)
一个cache地址对应一个字的数据
相联存储器
快速判断主存对应的地址是否在cache中
步骤如下:
-
把拿到的主存地址通过不同的映射方式拿到标志key
-
使用多路并发比较线路进行在cache中查找符合的
-
- 在有效位为1的块中进行查找(提高效率)
- 并发比较标记字
- 找到则使用块内地址找到精准的唯一地址
- 拿到该地址的数据
-
找到就放进符合寄存器取出命中行的数据
全相联映射
工作原理
主存地址的标记放进比较器寻找是否命中,命中则取出对应cache的数据
案例理解
假设cpu需要的访问序列如下,
- 1F对应000011111 在cache中找不到,去主存中取整个块,在cache中随机找一个空的块放入,不仅放块数据,还有放标志位,有效位变为1 ,然后在cache中取出对应块内地址的数据(11对应1C)
- 找20 24 (同1F)
- 找到1E000011110 cache命中 直接拿出1D数据
特点
- 主存地址 = 主存块号 + 块内地址
- cache利用率高
- 块冲突率低
- 淘汰算法复杂(要一一检索所有cache块)
- 适用于小容量cache
直接映射
工作原理
案例理解
- 1F 0000 111 10 从主存中拿到后放到第7cache块
- 20 24 miss 同1F
- 1E 0000 11110 hit 直接拿到1D数据
- 44 0010 001 00 先找到第1个cache块 比较标志tag 不一致 miss 从主存中取出覆盖
特点(与全相联完全相反)
- 主存地址 = 主存区号 + 区内块号 +块内地址
- cache利用率低
- 块冲突率高
- 淘汰算法简单(只比较一个)
- 适用于大容量cache
组相联映射
工作原理
案例理解
- 1F 00001 11 11 11对应第三组 miss 从主存取出 随机放入组内块
- 20 24都miss 同上
- 1E 00001 11 10 11对应第三组 存在标志00001 hit 直接取出块内10对应的1D数据
- 48 54 都miss
- 107时 10000 01 11 对应第一组 没有对应标志块,进行替换
特点(折中)
- 主存地址 = 主存组号 + 组内块号 +块内地址
- 折中
- k路组相联的k表示一组内多少行 所以8路就是全相连 1路就是直接映射
例题1 直接映射
\1) 直接映射 主存地址 = 区号 + 区内块号 + 块内偏移量
- 块内偏移量 cache块大小 16B 所以4位表示
- 区内块号就是cache行数 64KB/16B 2^12bit 12位
- 区号: 32-4-12 = 16位
2)数据字长32位 16B 可以知道有4个字 因此块内偏移量的4位:2位字偏移 2位字节偏移
3)容量 = cache行数 * 每行的位数 = 2^12行 * (1+16+128)
例题2 组相联映射
\1) 组相联映射 主存地址 = 组号 + 组内块号 + 块内偏移量
- 块内偏移量 cache块大小 8*32bit=32B 所以5位表示
- 组内块号就是cache组数 cache行数16KB/32B 2^9bit 所以组数2^9bit/4 = 2^7bit 7位
- 组号: 总位数(16MB = 2^24位)组号24-7-5 =12位
2)100个字 在主存中占100%8 = 13块<2^7组 所以都在主存的第0组
不命中的字是0 8 16…
3)加速比由第二问得出