地址映射#
将内存进行分块,CPU Cache 按行划分,将块映射进 Cache 行内,通过 tag、valid 判断是否命中。
直接映射中,一个内存块只能映射到一个特定的 Cache 行,映射到同一个 Cache 行的多个内存块存在竞争,当出现竞争时,一定会出现 Cache 失效
全相联映射中,内存块可以映射到 Cache 的任意一行,这种情况下,Cache 匹配通过 tag 和 valid 判断是否有效,这样子竞争的情况减少,但是查找 Cache 命中所需的时间增加
组相联映射中,一个 Cache 行可以映射到一个特定的组,这个组是根据地址确定的,最终可以映射到组内的任意一行,在确认组之后,只需在组内比对 tag 判断是否命中
#
Cache 一致性#
全写 - 非写分配
对于写操作,命中 Cache 时,不仅写入 Cache,还写入内存。不命中时,只写入内存,不调入 Cache
写回 - 写分配
对于写操作,命中 Cache 时,只写入 Cache,不写入内存,添加一个 dirty 位判断是否被修改,当 Cache 行被淘汰时,先写入内存再淘汰。不命中 Cache 时,调入 Cache 再更新 Cache。这使得每次不命中都需要从主存调块。
Cache 替换算法#
用于全相联 / 组相联映射
RAND:随机,命中率可能较低
FIFO:先进先出,最早进入可以能经常使用。命中率可能低
LRU:近期最久未使用的,命中率较高
LFU:最不经常使用的,将一段时间内,换出访问次数最少的行