思维导图
3.6 高速缓冲存储器
程序访问的局部性原理
时间局部性
- 最近的未来要用到的信息,很可能是正在使用的信息(有些循环可能重复使用信息)
空间局部性
- 最近的未来要用到的信息,很可能与现在正在使用的信息在存储空间上是邻近的。(因为指令通常是顺序执行的,数据一般也是以向量、数组等形式簇聚地存储在一起的)
Cache的基本工作原理
-
Cache和主存都被划分为相等的块。(便于CPU和主存之间交换信息)
-
每块由若干字节组成,块的长度成为块长(Cache行长)
-
Cache中仅保存主存中最活跃的若干块的副本(Cache容量小于主存)
-
Cache按照某种策略,预测CPU在未来一段时间内欲访问的数据,装入Cache
-
CPU发出请求,如果访存地址在Cache命中,就将此地址转换为Cache地址,直接进行Cache读操作。与主存无关
-
如果不命中,需要访问主存,并把此字所在的块一次性从主存调入Cache。
-
如果Cache已满,置换算法
-
CPU和Cache直接的数据交换以字为单位
Cache与主存之间的数据交换以Cache块为单位
Cache和主存的映射方式
直接映射
- 优点:实现简单
缺点:不够灵活,块冲突概率最高,空间利用率最低 - 映射到 主存mod cache块
全相联映射
- 优点:映射方式灵活,cache利用率高,快冲突率低,命中率高
缺点:比较速度慢,实现成本高,Cache比较电路的设计和实现比较困难,常需要昂贵的按内容寻址的相联存储器进行地址映射。
适合:小容量Cache - 主存中任何一块都可以映射到Cache的任何一块中
组相联映射
- 直接映射和全相联映射的折中,Cache和主存都分组,然后组间采用直接映射,组内采用全相联映射
- 优缺点:二者折中
- 也就是说,将Cache分成u组,每组v块,主存块存放到哪个组是固定的,至于存到该组哪一块则是灵活的
Cache中主存块的替换算法
随机算法(RAND)
先进先出(FIFO)
- 选择最早调入的行进行替换
近期最少使用(LRU)
- 近期内长久未使用的行进行替换
最不经常使用(LFU)
- 一段时间内访问次数最少的行换出
Cache写策略
Cache写命中
-
全写法
-
数据同时写入主存和Cache
-
缺点:增加访问次数,降低了Cache效率
-
解决:Cache和主存之间增加写缓冲
- 解决速度不匹配,FIFO队列
-
-
写回法
- 只写入Cache,当被替换时才写入主存
- 每行设置一个标志位(脏位),反映是否被CPU修改过,避免访问不一致
Cache写不命中
-
写分配法
- 加载主存的块到Cache,然后更新
- 试图利用程序的空间局部性,
- 缺点:不命中需要重新从主存中读
-
非写分配法
- 只写入主存,不掉块
- 通常与全写法合用,写分配法通常和写回法合用
- 原因:现在的计算机通常设立多级Cache,离CPU越远,速度越慢,容量越大