06-高速缓冲存储器
1.概述
1.1为什么使用cache
cpu发展速度很快,存储器发展速度很慢,CPU读取的指令,想要获取或者写入的数据必须等待存储器完成读写,cpu再快,存储器慢,cpu也只能进行空等,为了避免CPU空等的现象,在CPU和内存(DRAM)之间加入缓存,缓存采用SRAM
缓存容量小,速度高
主存 容量大 速度低
程序访问的局部性原理
时间局部性:当前正在使用的程序和数据在不久的将来还不使用到
空间局部性:当前正在使用的程序或者数据相邻的数据在不久的将来也会使用到
根据程序访问的局部性原理,将正在使用的程序和数据及其相邻的程序和数据放进缓存中
1.2 Cache的工作原理
主存和缓存的编址
主存和缓存都由块内地址和块号构成,块内地址就是偏移地址
主存和缓存的块内地址是相同的 主存中的块数是远远大于缓存块的块数
命中与未命中
缓存共有C块
主存共有M块 M>>C
命中 主存块调入缓存 主存块与缓存块建立了对应关系
用 标记 记录与某缓存块建立了对应关系
未命中 主存块未调入缓存 主存块与缓存块未建立对应关系
用 标记 记录与某缓存块建立了对应关系
Cache的命中率
使用命中率评估命中的指标 CPU欲访问的信息在Cache中的比率
命中率与Cache的容量与块长有关
一般每块可取4-8个字
块长取一个存取周期内从主存调出的信息长度
Cache-主存系统的效率
效率e和命中率有关
e=访问Cache的时间/平均访问时间100%
设Cache命中率为h, 访问Cache的时间为tc,访问主存的时间为tm
e=tc/(htc+(1-h)tm)100%
1.3 Cache的基本结构
图见
https://www.bilibili.com/video/BV1WW411Q7PF?p=42&vd_source=3c88fb7dae36f53e6a15081fb7cf9ff8[10分16秒]
1.4 Cache的读写操作
读操作: CPU发出访问地址的要求
如果命中缓存 访问Cache取出信息送入CPU
如果没有命中缓存 访问主存取出信息送入CPU,同时判断Cache是否满了如果没满,将新的主存块调入Cache中,如果满了,执行替换算法腾出空位,将新的主存块调入Cache中
结束
写操作: 需要解决cache和主存的一致性问题
写直达(Write-through)
写操作时数据既写入Cache又写入主存
写操作时间就是访问主存的时间,Cache块退出时,不需要对主存执行写操作,更新策略比较容易实现
问题:可能存在频繁对统一内存数据块写的情况,如计算累加时的情况,会不断对同一内存单元进行修改
写回法(Write-back)
写操作时数据写入Cache不写入主存
当Cache数据被替换时才回写主存
写操作时间就是访问cache的时间,cache块退出时,被替换的块需写回主存,增加了cache的复杂性
1.5 cache的改进
- 增加cache的级数
片载(片内)Cache
片外Cache - 统一缓存和分立缓存
指令Cache 数据Cache
与指令执行的控制方式有关 是否流水
Pentium 8K指令Cache 8K数据Cache
PowerPC620 32K指令Cache 32K数据Cache
2.Cache-主存的地址映射
2.1 直接映射
将主存按照cache的大小进行划分,划分为多个区
每个区内的第0个字块放在Cache中的第0个字块,每个区内的第i个字块放在Cache中的第i个字块
标记为放置区的编号
特点:
每个缓存块i可以和若干个主存块对应
每个主存块j只能和一个缓存块对应
缺点:
调入冲突会很多
2.2 全相联映射
特点:
主存中的任一块可以映射到缓存中的任一块
2.3 组相联映射
组相联映射是直接相联映射和组相联映射的折中
某一主存块j按模Q映射到缓存的第i组中的任一块上
电路结构比较简单
在多层次的cache中,靠近cpu的层次使用直接相联或者是路数比较少的组相联,中间的层次采用组相联,距离cpu最短的层次采用全相联的方式,距离越远,对速度的强调就越低,对cache利用率就要求越高
3.替换算法
3.1 先进先出(FIFO)算法
最早放进去的先移出去
3.2 近期最少使用(LRU)算法
在最近的一段时间最少使用的cache,以后也很少使用,或者很久才会使用到
总结
直接映射 某一主存块只能固定映射到某一缓存块 不灵活,cache利用率低,速度快
全相联 某一主存块能映射到任意缓存块 成本高,cache利用率比较高,速度慢
组相联 某一主存块只能映射到某一缓存组中的任一 速度比较快,cache的利用率比较高