高速缓冲存储器
1. Cache的工作原理
当在手机上打开微信时,微信的数据会从辅存中调入内存,但由于内存的存取速度很慢,CPU的存取速度很快,会出现卡顿现象。
如果把内存中的数据加入Cache之后,Cache的速度很快,CPU与内存的速度矛盾被缓和。
2.局部性原理
- 空间局部性:在最近的未来要用到的信息(指令和数据),和可能与现在使用的信息在存储空间上时邻近的。
- 时间局部性:在最近的未来要用到的信息,很可能是现在正在使用的信息。
总结:基于局部性原理,可以把CPU目前访问的地址”周围“的部分数据放到Cache中。
3.性能分析
- 命中率H: CPU欲访问的信息已在Cache中的比率
- 未命中率:1-H
- tc为访问一次Cache的时间
- tm为访问一次主存所需时间
- 平均访问时间 t = Htc+(1-H)(tc+tm) (先访问Cache,若Cache为命中在访问主存)
- t = H tc+(1-H) tm (同时访问Cache和主存,若Cache命中则立即停止访问主存)
题目
【例3-2】假设Cache的速度是主存的5倍,且Cache的命中率为95%,则采用Cache后,存储器性能提高多少(设Cache和主存同时被访问,若Cache命中则中断访问主存)?
- 先设周期,Cache的存取周期为t,主存的存取周期为5t
- 若Cache和主存同时访问,命中时访问时间为t,未命中访问时间为5t。
- 若先访问Cache在访问主存,命中时访问时间为t,为命中访问时间为5t。
- 列计算式
根据局部性原理,如何讲主存中的信息放入Cache中
- 分块:将主存的存储空间分块,主存与Cache之间以”块“为单位进行数据交换。
思考
- 如何区分Cache与主存的数据块的对应关系?
- Cache很小,主存很大,如果Cache满了怎么办?
- CPU修改了Cache中的数据副本,如何确保主存中数据母本的一致性?
总结
4.映射(类比哈希)
- 标记:为什么要有标记,因为需要记录Cache中记录的时主存中的哪一块地址
- 有效位:如何Cache的某一行中有地址则记录主存的地址,没有的话则标记为0,0也相当与时一个地址,所以需要有一个有效位来证明此标记是否有效。1为有效,0为无效。
全相联映射
- 主存块号:内存的大小除于Cache的大小,作为主存块的地址。
- 块内地址:Cache块的大小决定,总共有多少个数据
- 如何访存:先于Cache块中每一个标记进行对比,且有效位为1的话命中,否则未命中,未命中就访问主存。
直接映射
- 主存块在Cache中的位置=主存块号%Cache总块数。
- 如何有两个主存块在Cache中的位置相同,则替换掉原来的数据。
- 如何优化标记:将Cache的快数转化为2的n次方形式,那么只需要标记号末尾的n位就可以直接反映它在Cache中的位置。所以标记就可以减去这后面n位。
级相联映射
- 所属分组=主存块号%分组数
- 如何访存:根据后n位确定所属组号,在看标记是否相同,在看有效位是否位1
对比
- 全相联映射:Cache存储空间利用充分,命中率高,查找”标记“最慢,有可能需要对比所有行的标记
- 直接映射:对于任意一个地址,只需对比一个”标记",速度最快,但是Cache存储空间利用不从分,命中率低
- 组相联映射:两种方式综合,效果最好。
5.Cache替换算法
需不需要替换算法
- 全相联映射:只有当Cache完全满了之后才需要替换,需要在全局选择替换哪一块
- 直接映射:如果对应位置非空,则毫无选择地直接替换
- 只有当分组满了之后才需要替换,需要在分组内选择替换哪一块。
替换算法
- 随机算法(Rand)
- 先进先出算法(队列)
- 近期最少使用(LRU)
- 最近不经常使用(LFU)
随机算法
先进先出
==抖动现象:==频繁的换入换出现象(刚被替换的块很快又被调入)
近期最少使用算法
- 命中时,所命中的行的计数器清零,比其低的计数器加1,其余不变
- 未命中且还有空闲行时,新装入的行的计数器置0,其余非空闲行加1
- 未命中且无空闲行时,计数值最大的行的信息块被淘汰,新装入的块的计数器置为0,其余全加1。
最近不经常使用
- 此算法没又近期最少使用算法好,加入说当前一直使用微信视频聊天的数据,之后不用的话数据会一直保存在Cache块中,不满足局部性原理。
6.Cache块写策略
写命中
- 全写法:当CPU对Cache写命中时,必须把数据同时写入Cache和主存,一般使用写缓冲。访存次数增加,速度边慢,但更能保证数据一致性
- 写缓冲:将需要写入主存的块放入写缓冲中,写缓存使用队列的形式,这样可以大大提高效率。
-
写回法:当CPU对Cache写命中时,只修改Cache的内容,而不立即写入主存,只有当此块被换出时才写回主存
-
脏位:当该Cache块被修改,就让该块的脏位标记为1,之后被替换时可以根据脏位来判断是否写回主存
写不命中
- 写分配法:当CPU对Cache写不命中时,把主存中的块调入Cache,在Cache修改,所以适合写回法使用
- 非写分配法:当CPU对Cache写不命中时只写入主存,不调入Cache,只有读未命中时才调入Cache中,所以配和全写法使用。
多级Cache