文章目录
存储器下
缓存
概述
由于CPU和主存的速度差异,避免CPU“空等”现象
程序访问的局部性原理
- 时间局部性:当前正在使用的数据和指令,在不久的将来还会被使用
- 空间局部性:当前正在使用的数据和指令,不久的将来,它相邻的是数据和指令也会被使用到
1. Cache的工作原理
- 编址
- 主存——缓存是以块为单位进行存储传输的,主存共分成了M块,Cache共分成了C块,其中C << M,两种块的大小相同,块内地址不变化
- 主存每个块内有b位块内地址,B个存储字,Cache块内的地址和主存是一样的,B是块长
- Cache块的标记对应主存中相应的块号

命中和不命中

命中率

Cache——主存的效率
效率的最大值是当h=1是,e=1
最小值是当h=0时,,e=tc/tm

只有当访问Cache的同时也在访问主存,得到的平均时间才是上式
当要先访问Cache,没有找到时再去主存里找,这样得到的平均时间是:htc+(1-h)(tm+tc),Cache没有时,要到主存里找,已经过了访问Cache的tc时间,所以访问主存时间一定有tc,不需要乘命中率,化简之后是tc+(1-h)*tm
2. Cache的基本结构

3. Cache的读写操作
读操作:

写操作:
涉及Cache与主存的一致性问题

4. Cache的改进
- 增加Cache的级数:片载Cache、片外Cache
- 统一缓存和分立缓存:指令Cache、数据Cache
Cache——主存的地址映射
- 直接相联映射
- 全相联映射
- 组相联映射
1. 直接相联映射
Cache共有2c个块,主存有2m个块,将主存块分成若干区,每个区块数和Cache块数相同。
Cache的字块0对应主存中每一区的第0块,字块1对应每一区的第一块,但是Cache块中只能存放这些块中的一个
主存地址由三部分组成:主存字块标记+Cache字块地址+块内地址
主存字块标记:主存的哪一个区
Cache字块地址:组中的哪一个块不知道Cache块中放的到底是哪个区的,所以要在Cache块添加标记,标记就是区号
CPU向主存传输地址,先根据Cache字块地址查看Cache中有没有这么块,有的话再将这个Cache块的区号标记和地址中的主存字块标记作比较
缺点:字块0只能存放每个区的第0块,利用率低
Cache块i = 主存块j mod C

2. 全相联映射
- 与直接相联映射恰好相反,没有划分区,它是Cache的每个块都可以存放主存的每个块
- Cache块的标记就是主存的字块标记,需要将主存地址的字块标记和Cache标记一一比较看是否命中
- Cache利用率高但结构比较复杂,需要比较的位数也多

3. 组相联映射
Cache块被分成若干组,每组有两块(2/4/8块均可)
主存分区,每个区大小和Cache的组数相等
映射时主存每个区的第0块可以放在第0组的任意一个位置
和直接相联映射相比,一个块有多个位置,一个位置被占用,其他位置为空时也可以继续使用
和全相联相比,要确定某个主存块是否被调入到Cache中,只需要知道这个块在所在区的块号,这个块号等于Cache的组号,再到这个组中查看组内哪个块的标记与区号一致即可,有两个比较器同时进行比较,只要有一个命中即可
主存块j对Q取模就是第几组,i=j mod Q,j可以映射到第i组的任意一块
距离CPU近的Cache可以采用直接相联映射,远的采用全相联

替换算法
- 先进先出(FIFO)算法:存在问题就是先出去的可能就是经常使用的
- 近期最少使用(LRU)算法
小结:
直接:不灵活
全相联:成本高

