缓存寻址方法混淆

7
我一直在了解缓存寻址的四种方式:
  1. 物理索引物理标记(PIPT)
  2. 物理索引虚拟标记(PIVT)
  3. 虚拟索引物理标记(VIPT)
  4. 虚拟索引虚拟标记(VIVT)
以下哪种缓存会遇到同义词和同形异义词问题? 我知道 VIVT 会受到这些问题的影响,而 PIPT 不会。但是 PIVT 和 VIPT 呢?
1个回答

11
由于同义词发生在不同的虚拟地址映射到相同的物理地址时(其中一个要避免误判),在VIPT高速缓存中,同义词可能(虚拟地)索引到不同的高速缓存集合中(在这种情况下,数据不一致是可能的,例如,在一个集合中的同义词中写入后,在另一个集合中读取同义词[相同的物理地址,不同的虚拟地址]),而在PIVT高速缓存中,同义词总是映射到相同的集合,但是虚拟地址的标记部分的差异可能导致错误的未命中。
(在错失服务之前进行被牺牲块的回写的直接映射PIVT高速缓存将避免同义词问题,因为实际访问的内存[物理地址]必然会强制任何同义词驱逐,因为物理地址索引将是相同的,并且只有一个块位于该索引处。对于相同的原因,直接映射的写通PIVT高速缓存会表现出类似的行为;最新的数据值将在支持存储器[L2或内存]中。这假定任何写缓冲区或L2高速缓存都是物理标记的。如果在错失服务之前没有更新支持存储器,则错误的未命中[虚拟地址与标记不匹配但具有相同的物理地址]可能会从支持存储器读取过时数据。)
(请注意,PIVT通常只有在虚拟索引与物理索引相同时才有意义,即在页偏移内使用虚拟位。如果已经足够早地知道完整的物理地址以索引高速缓存,则几乎没有理由不使用物理地址作为标记。)
使用写通也无法消除同义词问题,只要同义词可以映射到高速缓存中的不同块。如果任何索引位都可能不同(使用虚拟索引)或提供了多个方式,则可以在该替代位置保留陈旧值,并且在使用不同虚拟地址探测高速缓存时找不到该值。读A、写B、读A(其中A和B是同义词)的序列可能会使第二次读取A在高速缓存命中时看不到写入B结果。(即使是直接映射的写通高速缓存,任何写缓冲区也需要进行物理标记[物理索引不是问题,因为写缓冲区相对较小]。)
虽然两个同义词同时存在于L1高速缓存中,在一个同义词上的写入后跟另一个同义词的读取的概率可能极低,但仍然希望正确处理这些情况。
由于同音词发生在相同的虚拟地址映射到不同的物理地址时(其中一个要避免误判),在VIPT高速缓存中,同音词将映射到相同的高速缓存集合,但标记将不同(因此没有错误的命中),而在PIVT高速缓存中,如果索引的物理位恰好匹配,则同音词可以映射到相同的集合,并且会在虚拟标记中错误地匹配。
总之,不太可能的PIVT设计存在同义词和同形异义词问题,而VIPT设计仅存在同义词问题。VIVT设计具有不现实的PIVT的所有问题,甚至特殊直接映射情况也无法解决(因为当用于索引的虚拟地址位不同时,同义词可能映射到不同的块)。
(在多核/处理器中,一致性通常由物理地址处理。虽然可以提供一个类似TLB的东西,将物理地址转换为虚拟地址[至少有一个PA-RISC处理器可能已经这样做了],但从该翻译缓存中驱逐会强制标记有该虚拟地址的任何高速缓存块被驱逐,类似于由于ASID用完而导致的驱逐。)
同义词和同形异义词的出现
一般来说,可写同义词可能并不常见,但它们出现的一种方式是如果一个文件由多个进程进行内存映射。显然,如果一个进程已经映射了另一个进程用于映射文件的地址范围(例如,对于堆内存),那么该进程无法将文件映射到其他进程正在使用的相同虚拟地址范围。
只读同义词可能更常见。一些操作系统在整个系统中使用单个填充为零的页面,并将许多虚拟页面映射到此相同的物理零页面(当程序尝试写入该页面时,使用写时复制)。如果应用地址空间布局随机化(一种安全功能)来处理每个进程,不同的进程可能会对相同的代码/文本物理页面使用不同的虚拟地址。
也许最常见的同形异义词形式与具有多个地址空间有关。在常见的操作系统中,每个进程都有自己的地址空间(尽管操作系统通常为其保留一部分地址空间并在不同进程中使用相同的映射来使用该部分)。通过这种方式,只有在特定的虚拟标记高速缓存重用ASID时才需要特殊处理这种同形异义词。 (ASID降低了避免同形异义词问题的特殊缓存管理的频率,但它们并不能完全消除问题。然而,即使减少频率也可以通过降低性能要求使软件更简单;高度优化的代码通常更难以生成和维护。)
另一种同形异义词是当页面被交换出并在不同的地址处交换回内存时。如果从内存进行I/O(而不是像某些处理器中的缓存一样),则操作系统至少必须写回任何高速缓存内容,因此刷新适当的内容就不那么重要了。虽然在OS将页面视为适合从磁盘驱逐时,页面将在缓存中具有某些内容的概率很低(特别是L1缓存,其中使用虚拟地址最具吸引力,因为具有延迟优势),并且该内容保留在缓存中直到页面交换回内存的概率很低,但即使这些不可能性的乘积也不为零。
在任何情况下,即使硬件设计人员想不出同义词和同形异义词的有价值用途,也可能希望不
使用单一地址空间操作系统,同名现象是不可能的,因为所有进程使用相同的虚拟地址到物理地址的映射,如果允许同义词,则只能用于只读内存。在这些条件下,可以使用VIVT缓存而不会出现同名和同义词问题。(SASOSes可以简化进程间通信。但类UNIX操作系统和某些其他操作系统设计用于多个地址空间。)
另外,只读内存的同义词不会引入正确性问题(仅可能浪费带宽和重复缓存同一物理内存的缓存容量)。这使得VIVT对指令缓存不那么不利。 (x86在要求指令缓存具有高速缓存一致性方面有些不寻常,尽管提供一致的指令缓存可以简化一些软件。)
此外,VIPT缓存中的同义词问题可以通过使用初始虚拟索引作为路径预测的形式来处理(在缺失时探测替代集--AMD Athlon的64 KiB、2路缓存与4 KiB页面执行了此操作--或使用物理索引标记包含的L2缓存,其中超出L1索引的虚拟地址位用于索引,包括在内,使先前缓存的L1虚拟索引处的块失效)或要求任何同义词索引相同的缓存块集(最简单的方法是页面着色,其中对应的物理地址位人为地与用于索引的虚拟地址位相同)。

非常感谢这个精彩的解释。我是一个新手,所以确实有一些疑问。1.同义词只能出现在共享内存环境中吗?还是有其他特定条件?2.或者甚至是直接映射的缓存,在服务未命中之前不会写回任何受害脏块,读取将不会看到具有不同虚拟地址标记的脏缓存块。-您能否再详细解释一下?3.写通缓存可以解决同义词的问题吗?4.VIVT缓存会遭受同音词和同义词的影响吗?谢谢。 - Vaibhav Sundriyal
@ Paul Clayton 是的先生。非常感谢。 - Vaibhav Sundriyal

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接