3.5 高速缓冲存储器
CPU与主存和CPU与cache以
字
为单位交换数据
Cache与主存以块
为交换单位
缓解CPU
与主存
速度不匹配的矛盾
3.5.1 局部性原理
空间局限性:将来需要访问的数据在当前使用的数据的周围
时间局限性:最近使用的数据将来不久也会使用
cache集成在CPU中,由SRAM构成【速度快,集成低,成本高】
3.5.2 cache的基本工作原理
1.CPU优先以Cache块查找数据
2.没找到就访问主存并将对应块复制到Cache
3.5.3 Cache和主存的映射方式
Cache是主存的副本
-
1.直接映射
- 位置:Cache块行号 = 主存块号%Cache块数
- 地址结构:
(有效位) (脏位) 标记 行号 【Cache不需要保存】
块内地址 数据 标记优化:由于映射到同一行的主存块号的行地址相同,因此不需要保存行号
- 优点:标记对比最快
- 缺点:空间利用不充分【即使有空闲空间也不能存放】
- 写入操作:将
有效位
标记为1
,标记位
改为对应块号
。如果原先已有数据,直接覆盖。 - 访问操作:根据
主存物理地址
获取行号,若对应Cache行相同且有效位
为1
,直接访问。若不符合,就从主存访问,并复制到Cache中。 - 替换算法:不需要替换算法,有冲突直接替换。
-
2.全相联映射
-
位置:可以装入任意位置
-
地址结构
(有效位) (脏位) (算法位) 标记 块内地址 数据 -
优点:可以装入任意位置,空间利用率高
-
缺点:查找时需要可能查找全部行,速度较慢,成本较高
-
写入操作:将
有效位
标记为1
,标记位
改为对应块的地址
。只有当所有的块写满才需要替换。 -
访问操作:将
物理地址
与所有cache行
的标记
对比,若找到且标记位
为1
表示命中。不符合就访问主存。
-
-
3.全相联映射
- 位置:将
多个Cache行
划分为一组
,可以放在主存地址%组数
的组中的任意位置。 - 地址结构
(有效位) (脏位) 标记 组号 【cache不需要保存】
块内地址 数据 标记优化:由于映射到同一行的主存组的组相同,因此不需要保存组号
- 优点:可以装入组中的任意位置,存储利用率也较高
- 写入操作:将
有效位
标记为1
,标记位
改为对应块的地址
。只有当组内所有的块写满才需要替换。 - 访问操作:根据
组号
对比组内所有块标记
,若找到且有效位为表示命中。否则,访问主存并复制到Cache中。 - 综合效果最好
- 位置:将
映射对比:
直接映射 | 全相联映射 |
---|---|
命中率最低,判断开销最小,时间长,标记的额外空间最小 | 命中率最高,判断开销最大,时间长,占用额外空间最大【需要保存整个主存地址】 |
3.5.4Cache中主存替换算法
- 随机替换:
满了
且没命中
就随机替换。 实现简单,没有考虑局部性原理 - 先进先出:
满了
且没有命中
就替换最先来的。实现简单,没考虑局部性原理 - 最近最少使用算法:
- ①给每个Cache行设置一个
计数器
。 - ②将访问到的Cache行的计数器值
清零
。 - ③没有命中的且比原来命中的行的计数器值小的+1。
- ④需要替换时选择计数器值最大的。
- 考虑到了局部性原理。
- 如果
频繁访问
的块
大于Cache行数,会发生抖动
。
- ①给每个Cache行设置一个
- 最不经常使用算法:
- ①每个Cache行设置一个
计数器
- ②
访问到的
Cache行计数器+1 - ③没有访问到的计数器不变
- ④替换时选择计数器值最小的
- 如果
频繁访问某个块
,后面不再访问,将这和块替换出去比较困难
【计数器的值较大,其他计数器的值需要很长时间才能超过】
- ①每个Cache行设置一个
3.5.5 cache写策略
写命中情况
-
(1)回写发
解释:只修改Cache的内容,当Cache被替换下去时才修改主存。
优点:访问主存次数较少
补充:由于cache
和主存
的数据不一致,需要增加一个脏位
。 -
(2)全写法:
解释:同时修改主存和Cache数据
优点:不存在数据不一致的隐患
缺点:增加访问次数。CPI提高了
优化方案:在Cache
和主存
间添加写缓存
【SRAM芯片组成】,解决CPU和主存速度差距大。如果写
过于频繁
,会导致缓存溢出。
写不命中情况
- (1)写分配法
- 解释:将对应主存数据复制到Cache,CPU只修改Cache。
当被替换才写入主存
。【搭配回写发使用】
- 解释:将对应主存数据复制到Cache,CPU只修改Cache。
- (2)非写分配法
- 解释: 只修改
主存
,不将数据复制到Cache。【搭配全写法使用】
- 解释: 只修改
多级Cache:
各级Cache之间使用 全写法
+非写分配法
cache与主存之间使用 回写发
+写分配法