缓存寻址方法混淆

时间:2013-12-26 15:55:30

标签: caching cpu-architecture cpu-cache

我一直在阅读缓存可以解决的四种方式:

  1. 物理索引物理标记(PIPT)
  2. 物理索引虚拟标记(PIVT)
  3. 虚拟索引物理标记(VIPT)
  4. 虚拟索引虚拟标记(VIVT)
  5. 以下哪个缓存会受到同义词和同音词问题的影响? 我知道VIVT会受到这些问题的困扰,PIPT也不会。但是PIVT和VIPT呢?

1 个答案:

答案 0 :(得分:9)

由于当不同的虚拟地址映射到相同的物理地址(其中一个想要避免错误的错误)时会出现同义词,因此在VIPT缓存中,同义词可能(虚拟地)索引到不同的缓存集(在这种情况下,数据不一致是可能的,例如,通过写入一组中的同义词,然后读取同义词[另一组中的相同物理地址,不同虚拟地址]),而在PIVT缓存中,同义词总是映射到同一组但标签部分中的差异虚拟地址可能导致未指示。

(在未命中服务之前执行受害块回写的直接映射PIVT缓存将避免同义词问题,因为实际访问的内存[物理地址]必然会强制驱逐任何同义词,因为物理地址索引将是相同的,并且在该索引处只有一个块。直读映射的PIVT高速缓存在行为上会出于同样的原因;最新的数据值将在后备存储[L2或内存]中。任何写缓冲区或L2缓存都是物理标记的。如果在服务未命中之前未更新后备存储,那么错误的未命中[虚拟地址与标记不匹配但具有相同的物理地址]可以从后备存储读取过时数据。)

(注意PIVT通常仅在虚拟索引与物理索引相同时才有意义,即,当使用页面偏移中的虚拟位时。如果已经足够早地知道完整的物理地址以索引缓存,那么没有理由不使用标签的物理地址。)

只要同义词可以映射到缓存中的不同块,使用直写就不会删除同义词问题。如果任何索引位可能不同(使用虚拟索引)或提供了多种方式,则过时值可能会保留在该备用位置,并且在使用不同的虚拟地址探测高速缓存时找不到该值。读取A,写入B,读取A(其中A和B是同义词)的序列可能使第二个读取A在第二个读取A是高速缓存命中时看不到写入B的结果。 (即使使用直接映射的直写高速缓存,任何写缓冲区都需要进行物理标记[物理索引不是问题,因为写缓冲区相对较小]。)

虽然两个同义词同时存在于L1缓存中并且写入一个然后读取另一个同义词的概率可能非常低,但仍然期望这样的情况将被正确处理。

由于当同一个虚拟地址映射到不同的物理地址(其中一个想要避免错误命中)时会出现同音异义词,因此在VIPT缓存中,同音异义词将映射到相同的缓存集,但标签会不同(所以没有虚假命中)在PIVT缓存中,同音异义词可以映射到同一个集合(如果索引物理位碰巧匹配)并且在虚拟标记中会错误匹配。

总之,不太可能的PIVT设计受同义词和同音词问题的影响,而VIPT设计仅受同义词问题的影响。 VIVT设计具有不切实际的PIVT和更多的所有问题(即使特殊的直接映射情况也不起作用,因为当用于索引的虚拟地址位不同时,同义词可以映射到不同的块)。

(对于多核/处理器,一致性通常由物理地址处理。虽然可以提供将物理地址转换为虚拟地址的TLB模拟[至少有一个PA-RISC处理器可能已经这样做],从该缓存的翻译中逐出将迫使标记有该虚拟地址的任何缓存块被逐出类似于由于耗尽ASID而导致的驱逐。)

同义词和同音异义词的出现

可写同义词通常可能不常见,但它们可能出现的一种方式是文件是由多个进程进行内存映射。显然,如果一个进程已映射(例如,对于堆内存)另一个进程用于映射文件的地址范围,则该一个进程无法将该文件映射到另一个进程正在使用的相同虚拟地址范围。

只读同义词可能更常见。某些操作系统在整个系统中使用一个零填充页面,并将许多虚拟页面映射到同一个物理零页面(当程序尝试写入该页面时使用写入时的复制)。如果每个进程应用地址空间布局随机化(安全功能),则不同的进程可能会对代码/文本的相同物理页使用不同的虚拟地址。

也许最常见的同音异义形式与多个地址空间有关。在常见的操作系统中,每个进程都有自己的地址空间(尽管操作系统通常为自己保留该地址空间的一部分,并在不同进程中为该部分使用相同的映射)。通过将地址空间标识符附加到虚拟地址,可以减少这种类型的同音异义词。通过这种方式,只有当ASID被重用于特定的虚拟标记高速缓存时,才需要对这种同音异义词进行特殊处理。 (ASID降低了特殊缓存管理的频率,以避免同音异义问题,但它们并不能解决一般问题。但是,即使降低频率也可以通过降低性能要求使软件变得更简单;高度优化的代码通常都更难生产,更难维护。)

另一种形式的谐音是当页面被换出然后换回到不同地址的内存时。如果I / O是从内存完成的(不是某些处理器中的缓存),则操作系统必须至少回写任何缓存内容,因此刷新适当的内容不是问题。虽然当操作系统认为它是驱逐到磁盘的良好候选者时,页面在缓存中具有某些内容的概率(尤其是使用虚拟地址的L1缓存因为延迟优势而最具吸引力)的可能性很低且任何此类内容的概率很低将保留在缓存中,直到页面被换回内存很低,即使这些不太可能的产品不是零。

在任何情况下,即使硬件设计师不能认为对同义词和同音异义词有任何有用的用途,也不要求对这种情况进行特殊处理。

使用单地址空间操作系统时,同音异义词是不可能的,因为所有进程都使用相同的虚拟地址映射到物理地址,如果允许同义词,则它们用于只读存储器。在这些条件下,VIVT缓存可以在没有同音词和同义词问题的情况下使用。 (SASOSes可以简化进程间通信。但是,类UNIX操作系统和其他一些操作系统是为多个地址空间设计的。)


作为旁注,只读存储器的同义词不会引入正确性问题(仅可能从同一物理存储器的重复缓存中浪费来自错误丢失和缓存容量的带宽)。这使得VIVT对于指令缓存不那么缺乏吸引力。 (x86在要求指令高速缓存是高速缓存一致方面有点不寻常,尽管提供连贯的指令高速缓存可以简化某些软件。)

此外,VIPT缓存中的同义词问题可以通过使用初始虚拟索引作为路径预测的形式来处理(探测错过的备用设置 - 这是由AMD Athlon的64 KiB,2完成的)具有4 KiB页面的-way缓存 - 或者使用物理索引的包含标签的L2缓存,其中包含用于索引L1的多余虚拟地址位,使先前缓存的L1虚拟索引处的块无效)或者通过要求任何同义词来索引同一组高速缓存块(最简单的是通过页面着色,其中相应的物理地址位与用于索引的虚拟地址位人为地相同)。