DRAM 的参数:刷新时间、刷新周期、刷新操作周期

刷新的方法:集中式刷新、分散式刷新、透明式刷新

5.3.2 Cache

Cache:小容量高速缓冲存储器、由 SRAM 组成,速度和 CPU一样快。

Cache 存放最近访问的数据。

程序运行时,CPU 使用的一部分数据会成批拷贝到 Cache 中。当需要读写命令时,先在 Cache 查询是否有已经存储的数据,如果有就直接取;如果没有,则直接访问主存。

平均访问时间:$T = pT_C + (1 - p)(T_C+ T_M) = T_c + (1-p)T_M$,通常 $Tc \ll T_m$

要降低平均访问时间,就要提高命中率 $p$.

5.3.3 Cache 和主存的映射

映射方式方式相联度
直接映射$Cache 行号 = 主存块号 \bmod Cache 行数$(即取主存快号的低位地址)$1$
全相联映射Cache 中每个块记录取自主存中的哪个地址。Cache 行数
组相连映射将 Cache 所有行分组,将主存块直接映射到 Cache 固定某一组中。行内使用全映射。$n$

5.3.4 Cache 失效率的影响因素

Cache 大小:Cache 越大,失效率越低,但成本更高

Block 大小

  • Block 越大,失效率越低
  • 但是 Block 过大时,失效率会提高,因为块数太少。

Cache 映射方式

  • Cache 容量小时,Cache 映射方式对失效率有影响
  • Cache 容量大时,Cache 映射方式对失效率影响不大。

Cache 失效类型

  • 强制失效:首次访问某个数据块时导致 Cache 失效。
  • 容量失效:Cache 不能存放程序运行所需的所有块,需要不断替换。
  • 冲突失效:直接映射和组相联映射中,多块内存数据映射到 Cache 的同一个位置

5.3.5 Cache 的一致性问题

Cache 的一致性问题

  • 主存更新后,Cache 没有及时改变相应内容。
  • 多个设备访问主存时,修改了主存或Cache其中一个,但是另一个没有更新。
  • 多个 CPU 更改了自身 Cache 内容,但是主存和其他 CPU 的 Cache 没有更新。

Cache 写机制

  • Write Through(写直达,在写命中时使用)
    • 写操作产生时,新值同时写到 Cache 和主存中。但是这样会导致内存速度太慢。
    • 考虑使用写缓冲(Write Buffer):写操作产生时,将要写入内存的数据放到写缓冲,然后写缓冲负责把数据写到主存,CPU 继续执行后面指令。
  • Write Back(写回,在写命中时使用)
    • 每个 Cache 行设置一个修改位,如果被修改,则修改位为 1。
    • 当修改位为 1 的块被替换出去时,把它写回主存。
  • Allocate-on-miss(写分配,在写不命中时使用)
    • 更新主存,再将主存块放入 Cache
  • No-allocate-on-write(写不分配,在写不命中时使用)
    • 更新主存,但是不将主存块放入 Cache

写直达Cache可用写分配或写不分配,写回Cache通常用写分配。

5.3.6 Cache 替换方法

当新的主存块需要复制到 Cache 中,而 Cache 已满,则需要替换其中的一个块。

对于直接映射,只有一个对应位置,直接替换旧信息。

对于组相联映射和全相联映射,需要考虑替换哪一行。

常用 Cache 替换方法

  • 先进先出 FIFO:把最早进入的块替换掉
  • 最近最少用 LRU:把最近最少用的块替换掉。为了实现此功能,需要维护一个历史记录序列,如果序列未出现当前主存位置,则将末尾弹出;如果序列出现当前主存位置,则将序列对应的数提到开头。 或者用计数器来维护在序列中的位置。命中时,将自身置为零,其他加一;不命中时,将自身置为零,其他加一,并把最大的淘汰。 若某段集中访问的存储区超过了 Cache 存储容量时,命中率将会极低。
  • 随机替换:随机选取一个替换。
  • 最不经常使用 LFU:将访问次数最少的块替换掉。 可以用一个计数器来实现。命中时,将自身加一;不命中时,将所有的块加一,并将最小的替换。

5.3.7 多级 Cache

单级/多级

  • 片内(On-chip)Cache:将Cache和CPU作在一个芯片上
  • 外部(Off-chip)Cache:不做在CPU内而是独立设置一个Cache
  • 单级Cache:只用一个片内Cache
  • 多级Cache:同时使用L1 、L2 Cache,有些系统还有L3 Cache

L1 Cache更靠近CPU,其速度比L2快,其容量比L2小

联合/分立

  • 分立:数据和指令分开存放在各自的数据和指令Cache中(L1 Cache 常用)
  • 联合:数据和指令都放在一个Cache中(L2 Cache 常用)