高速缓冲存储器Cache
- 工作原理:将某些主存块复制到Cache中,缓和CPU与主存之间的速度矛盾
- 局部性原理
- 时间局部性:现在访问的地址,不久之后也很可能被再次访问
- 空间局部性:现在访问的地址,其附近的地址也很可能即将被访问
- 性能分析
- 命中率H:CPU欲访问的信息已在Cache中的比率
- 缺失(未命中)率:M = 1 - H
- 👩💻 两种方式
- 先访问Cache,发现未命中再访问主存
- 同时访问Cache和主存,若Cache命中则停止访问主存
- 其他概念
- 主存与Cache之间以"块"为单位进行数据交换
- 主存的"块"又叫"页/页框/页面";Cache的"块"又叫"行"
- 主存地址可拆分为(主存块号,块内地址)的形式
每次被访问的主存块,一定会被立即调入Cache
Cache-主存映射方式
Cache中存储的信息
- 有效位(0/1)+ 标记 + 整块数据
- 其中"标记"用于指明对应的内存块,不同映射方式,"标记"的位数不同
全相联映射
- 主存块可以放到Cache的任意位置
- 主存地址结构:标记(整个主存块号)+ 块内地址
- 优点:Cache存储空间利用充分,命中率高;缺点:查找"标记"最慢,有可能需要对比所有行的标记
直接映射
- 主存块只能放到特定的某个Cache行,行号 = 主存块号 % 总行数
- 主存地址结构:标记(主存块号前几位)+ 行号(主存块号末几位)块内地址
- 优点:对于任意一个地址,只需对比一个"标记",速度最快;缺点:Cache存储空间利用不充分,命中率低
组相联映射
- 主存块可以放到特定分组中的任意位置,所属组号 = 主存块号 % 总组数
- 主存地质结构:标记(主存块号前几位)+ 组号(主存块号末几位)块内地址
- 优点:另外两种方式折中,综合效果较好
- 术语:n路组相联映射------每n各Cache行为一组
Cache替换算法
- 随机算法(RAND)
- 随便选一个主存块替换
- 过于Freestyle,效果很差
- 先进先出算法(FIFO)
- 优先替换最先被调入Cache的主存块
- 不遵循局部性原理,效果差
- 👩💻近期最少使用(LRU)
- 将最久没有被访问过的主存块替换。每个Cache行设置一个"计数器"(Cache块的总数=2^n,则计数器只需n位),用于记录多久没有被访问
- 基于"局部性原理",近期被访问过的主存块,在不久的将来也很有可能被再次访问,因此淘汰最久没被访问过的块是合理的。LRU算法的实际运行效果优秀,Cache命中率高。
- 最不经常使用(LFU)
- 将被访问次数最少的主存块替换。每个Cache行设置一个"计数器",用于记录被访问过多少次
- 曾经被经常访问的主存块在未来不一定会用到,LFU实际运行效果不好
Cache写策略
非写分配法通常与全写法合用,写分配法通常和回写法合用
- 写命中
- 全写法(直写法,write-through):当CPU对Cache写命中时,必须把数据同时写入Cache和主存,一般使用写缓冲(write buffer)
- 回写法(write-back):当CPU对Cache写命中时,只修改Cache的内容,而不立即写入主存,只有当此块被换出时才写回主存
- 写不命中
- 写分配法(write-allocate):当CPU对Cache写不命中时,把主存中的块调入Cache,在Cache中修改。
- 非写分配法(not-write-allocate):当CPU对Cache写不命中时只写入主存,不调入Cache
- 多级Cache:现代计算机通常采用多级Cache结构,各级Cache间常采用"全写法+非写分配法",Cache和主存间常采用"写回法+写分配法"