工作原理:将某些主存块复制到Cache中,缓和CPU与主存之间的速度矛盾
局部性原理
时间局部性是指最近还要用到的信息,很可能是现在正在使用的信息
空间局部性是指程序访问了某个存储单元,那么不久后其附近的存储单元也可能被访问
性能分析
Cache命中率:CPU将要访问的数据已经存放到Cache中的概率
Cache缺失率:Cache没命中的概率
平均访问时间:
两种访存方式
CPU与Cache/主存的信息交互单位为字,Cache与主存的信息交换单位为块
一个块通常由若干字组成
每次被访问的主存块,一定会被立即调入Cache
数据从主存拿过来应该放到Cache的什么位置
全相联映射(随便放)
直接映射(对号入座)
规定好了主存中每一块都放置在Cache中的位置,且相邻块之间映射的位置也是相邻的
优点:实现简单,访问时对于任意一个地址,只需要对比一次“标记”,速度最快
缺点:块冲突频率最高,空间利用率最低
计算方法
主存地址长度
Cache地址长度
Cache行的总位数
标记位数t + 数据位 + 1位有效位 + 1位脏位(回写策略)
t(主存区号、Tag位、主存字块标记)
c(Cache块的地址位数)
m(主存块的地址位数)
b(块内地址总数)
有效位
脏位
LRU位
其他
组相联映射(安号分组,组内随便放)
先按号分组(比如8块Cache分为4组)
组内任意放(组内是全相联映射)
计算
把最近比较少用的替换掉
需要记录进入cache的先后顺序
也需要软件技术器记录使用的频率
实现起来比较复杂且开销大
根据程序访问局部性原理选择近期使用的最少的存储块作为替换的块
实际运行效果优秀,Cache命中率高
Cache块的总数若为2n,则计数器只需要n位
手算找哪一块被替换方法:
4,6,12,4,8
,下次访问块号14
14
(被替换的块号),剩下三块的块号就从后往前数三个(重复的算一个)12,4,8
只统计使用次数,谁被用的最少就替换谁
通常也需要硬件设计计数器支持
流程:
这样容易造成使用次数太大导致存不下,所以不如LRU
确保CPU修改Cache中数据副本后与主存数据母本一致
先只修改Cache的内容,不立即写入主存,为了表示数据是被修改过的,所以用一个脏位记录
当此块被换出时写入主存
减少了访存次数,但存在数据不一致的隐患
将要写的数据字节写入Cache和写缓冲(SRAM实现,所以比写回法的直接写入主存快的多)中,写缓冲会自己一个个写到主存(此过程与CPU无关)
写的操作不频繁时效果非常好,但如果写操作繁琐,可能会因为写缓冲饱和而发生阻塞
先把主存中的块读到Cache中,然后就变成了写回法
直接写入到主存,不用读入Cache(只有“读”未命中时才调入Cache)
相当于不用往Cache中写的全写法