CPU 缓存分为缓存行,缓存行具有固定大小(通常为 64 字节)。一般来说,我们可以说每个缓存线由它所指的内存地址标识(最后 6 位被丢弃,因为它们指的是缓存线内的偏移量)。
为了使查找更快,地址分为两部分:index和tag。该指数解决了一系列的高速缓存行,其立场是众所周知的:访问一组是真快。在N 路关联集合中,您有 N 个缓存行,没有特定的顺序,将使用标签标识。
现在我们说标签和索引是内存地址的一部分,但是地址是什么类型的呢?物理的还是虚拟的?
理论上,您可以拥有物理索引(PI)、物理标记(PT)、虚拟索引(VI) 和虚拟标记(VT) 的任意组合。每种组合都有其优点和缺点。一般来说,我们可以说使用物理地址的缺点是必须等待虚拟地址被转换(在 TLB 未命中的情况下这可能会很昂贵),另一方面,使用虚拟地址虽然速度更快,但可以导致一致性问题,因为多个虚拟地址可以映射到相同的物理地址,并且映射可以随着时间的推移而改变,需要缓存刷新。
由于这些原因,PIPT 仅用于慢速缓存(例如 L2/L3),很少使用 VIVT,几乎从不使用 PIVT,而 VIPT 用于快速(和小)缓存。
使用 VIPT 的优点是,虽然查找可以与地址转换并行开始(因此它比 PIPT 快),但它使用查找的最后部分的物理地址,因此,为索引选择了适当的大小,它可以防止一致性问题。索引的正确大小取决于页面大小:虚拟地址和物理地址之间的转换是在页面级别进行的,如果索引的选择方式始终是指页面内缓存行的偏移量。如果我们使用物理地址或虚拟地址,它不会有任何区别。不幸的是,这限制了缓存的大小,因此它仅用于快速和小型缓存(例如 L1)的原因。