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 常用)