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