基本概念:
- cache line —— 缓存行,一般为 32B、64B 。
- way —— 路。
- set —— 组。
- VIPT —— Virtual Index Physical Tag。 Index来自虚拟地址。
- PIPT —— Physical Index Physical Tag。 Index来自物理地址。
cache 更新策略:
- write through —— 写时更新cache中的数据和Memory中的数据。
- write back —— 写时只写cache中的数据并标记dirty,后续合适的时候再协会到Memory。
cache分配策略:
- write allocation —— 写数据时,如果 cache miss, 分配cache line。
- read allocation —— 读数据时,如果 cache miss,分配cache line。
别名问题:
- alias —— 使用VIPT时出现的。不同的虚拟地址映射到相同的物理地址,会产生不同的 Index ,就产生了别名问题。
歧义问题:
- ambiguity —— 使用VIPT时出现的。 例如不同进程相同的虚拟地址产生了相同的 Index 和 Tag 但指向不同的物理地址。 OS在进程切换时清除cache可以解决此问题。
cache 内部结构:
- 直接映射 —— 物理页面固定地映射到指定的cache line中
- 全相联 —— 物理页面可映射到任意cache line中
- 组相联 —— 是直接映射与全相连的综合。 物理页面可以映射到固定的组(任意的路)中。
下面是一个4路组相联的例子:
- set index 是 cache line 在 way 中的序号。
- set index 通常直接简称为 index 。
- 如果一个物理地址确定,那么其 index 就确定了,这个地址对应的数据缓存在哪个 set 中也就确定了。
- 如上图所示, 物理地址的 bits[y-1:x] 决定了数据缓存在哪个set中。
- 一个物理地址上的数据缓存时,只会缓存到固定的set中, 如果cache已满,只会逐出同一set的cache line,而不会影响其他set的cache line。
- 一个page缓存时会占用多个set。 例如一个4KB page缓存到64B cache line的cache中时,会占用64个set(占用每个set中的一个cache line)。
- 缓存一个page的连续的set,也称为 cache bin。