?为什么当寄存器组无限扩大的时候,数据通路会更复杂

不仅仅是因为速度不匹配,同时为了简单数据通路,需要设计 cache

是否可行?

根据 局部性原理 得到是可行的

如何组织?

  1. 把 cache 划分成相对小的块,访问内存的时候按块存储。使用 cache 的时候如果不命中(缺失处理),则会有额外的装载耗时,称为不命中的惩罚(penalty),这里可以并行优化。
  2. 程序员操作 cache 的能力只能有 flush ,因为在数据通路上,其他动作都是透明的
    1. 用有效标识标记是否有效(原则上保证不会出错,顺便可以有 flush 的功能)

映射关系是什么?

有三种方式映射:

  1. 直接映射(模映射):每个主存块映射到 cache 的固定行
    1. 可以直接解读内存地址含义,高位定义为主存标记(标记位)并储存,不一样则没有命中
    2. 这里局部性就只和块的大小有关
  2. 全相连:任意映射
    1. 地址解读为主存标记和块内地址,内存开销较大
  3. 组相连:每个主存块映射到 Cache 的固定组中的任意一行
    1. 每一组 N 块称为 N 路组相连

块大小设置成多少?(利用率)cache 地址计算方法?给定一个地址,如何解读?

计算的时候 bit 进位加一成 byte

利用率 = 数据 bits/(有效位 + 标记位 + 数据)

内存关联度

如何更新 cache/淘汰方法?

  • FIFO 排队
    • 不是一种栈算法,命中率并不会随着组的增大而提高(其实和随机替换没什么区别)
  • LRU 最近最少用
    • 总是把固定最近一段时间的最少用的那一块淘汰
    • 一种实现是:把最近访问的放在队头,把队尾的淘汰,但是在内部这样不好搞。采用计数器,每次命中的时候置零其他加一
  • LFU

cache 一致性

脏标记:标识这一块已经被改过了