一、高速缓存 (cache)
1. 高速缓存的核心思想
- 对于每个 k k k ,位于 k k k 层的更快更小的存储设备作为位于 k + 1 k+1 k+1 层的更大更慢的存储设备的缓存,层次结构的每一层都缓存自来自较低一层的数据对象。
2. 高速缓存的基本单元
- 第 k k k 层的存储器被划分为较少的块的集合,每个块的大小与 k + 1 k+1 k+1 层块的大小一样。
- 数据总是以块大小为传送单元在 k k k 和 k + 1 k+1 k+1 层复制。
3. 高速缓存的结构
-
(
S
,
E
,
B
,
m
)
(S,E,B,m)
(S,E,B,m)
每个存储器地址有 m m m 位,形成 2 m 2^{m} 2m 个不同的地址 ( k ) (k) (k)。
这样一个存储器的高速缓存被组织成一个有 S = 2 s S=2^{s} S=2s 的高速缓存组 ( k + 1 ) (k+1) (k+1)。
每个缓存组包含 E E E 个高速缓存行。
每一行是由一个有效位,一些标记位和 B = 2 b B=2^{b} B=2b 字节的数据块组成的。
4. 地址的结构
- 每一位地址都有其标志位,组索引和块偏移。
在长度为 m m m 的存储器中,地址这样存储:
t = m − ( s + b ) t=m-(s+b) t=m−(s+b) 位标记位 | s位组索引 | b位块偏移 |
---|
- 每个块都由标记位和组索引唯一决定,每个地址都由块和块偏移唯一决定。
4. 直接映射高速缓存(每个组只有 1 行)
高速缓存确认一个请求是否命中,然后抽取出字的过程分为三步:
- 组选择:从地址 w w w 抽出组索引位,找到高速缓存组。
- 行匹配:先看有效位,再看 w w w 所在的标记位是否跟行里面的标记位对应
- 字选择:如果对应,则通过块偏移找到对应位。
- 不命中时的行替换:从下一层取出被请求的块,用新取出的行替换当前行
容易产生冲突未命中,不够灵活
5. 组相联高速缓存(每个组有多行)
- 组选择跟直接映射一样
- 行匹配必须检查多行的标记位和有效位
- 字选择跟直接映射一样
- 不命中时的行替换:问题在于,该替换哪一行?
- 如果有空行则替换空行
- 如果没有空行
- LFU:替换过去某个时间窗口内引用次数最小的行
- LRU: 替换最后一次访问时间最久远的一行
6. 全相联高速缓存(一个组包含所有高速缓存行)
- 只有一个组所以不需要组选择
- 行匹配和字选择都和组相联高速缓存一样
只适合做小的高速缓存,最灵活。
二、写策略
1. 写命中
要写一个已经缓存了的字 w w w,在高速缓存更新了 w w w 的副本之后,怎么更新下一层的 w w w?
- 直写:立即将w的高速缓存块写回到低一层,每次写都会引起总线流量
- 写回:尽可能地推迟更新,当替换算法要驱逐当前块的时候,才更新,缺点是需要维护额外的修改位。
2. 写不命中
- 写分配:加载相应的第一层中的块到高速缓存中,然后更新这个块。
- 非写分配:避开高速缓存,直接把这个字写到低一层。
直写高速缓存通常是非写分配的,写回高速缓存通常是写分配的
3.策略组合:
建议使用写回和写分配的高速缓存模型,因为写回通常试图利用局部性,写回的高复杂性也不再成为阻碍。