物理缓存和虚拟缓存有什么区别?

物理缓存和虚拟缓存有什么区别?

我无法理解虚拟缓存到底是什么。我理解的是虚拟内存。

据我所知,如果 CPU 想要访问内存,它会向 MMU 发送一个虚拟地址,MMU 使用页表找出物理内存地址。

现在,CPU 还会向缓存发送一个不同的地址(只是虚拟地址的末尾),该地址由一组编号、一个标签和一个偏移量组成,然后缓存会计算出它是否驻留在缓存中。

虚拟缓存与此有何不同?

在此处输入图片描述

答案1

根据使用虚拟地址位还是物理地址位进行索引和/或标记来寻址缓存,有四种方法。

由于索引缓存是最耗时的(因为可以并行读取一组中的所有路,并根据标记比较选择适当的路),因此缓存通常使用虚拟地址进行索引,从而允许在地址转换完成之前开始索引。但是,如果仅使用页面偏移内的位进行索引(例如,每个路不大于页面大小,并且对1进行索引的路大小进行简单模数),则此索引实际上使用的是物理地址。增加 L1 关联性通常主要是为了允许通过物理地址索引更大的缓存。

虽然基于物理地址的索引可以以大于页面大小的方式实现(例如,通过预测更重要的位或使用已知物理地址位的索引延迟来提供这些位的快速转换机制来隐藏转换延迟),但这并不常见。

使用虚拟地址进行标记可以在完成转换之前确定缓存命中。在提交访问之前仍需要检查权限,但对于加载,可以将数据转发到执行单元并开始使用数据进行计算;对于存储,可以将数据发送到缓冲区以允许延迟提交状态。权限异常会刷新管道,因此这不会增加设计复杂性。

(奔腾 4 数据缓存使用的 vhint 通过使用早期可用的虚拟地址位子集来推测性地选择路径,提供了这种延迟优势。)

(在可选外部 MMU 的时代,虚拟地址标签对于将转换几乎完全推到缓存设计之外特别有吸引力。)

尽管虚拟索引和标记缓存具有显著的延迟优势,但它们也引入了混叠的可能性,即相同的虚拟地址映射到不同的物理地址(同音异义词),或者相同的物理地址映射到不同的虚拟地址(同义词)。使用物理地址进行索引和标记可避免混叠。

同音异义词问题通过使用地址空间标识符 (ASID) 相对容易解决。(更改地址空间时刷新缓存也能保证没有同音异义词,但这样做成本相对较高。当 ASID 被重新用于不同的地址空间时,至少需要部分刷新,但 8 位 ASID 可以避免在大多数地址空间更改时刷新。)通常,ASID 由操作系统管理,但某些系统根据页表基址提供硬件检查 ASID 重用。

同义词问题更难解决。在缓存未命中时,必须检查任何可能的别名的物理地址,以确定缓存中是否存在别名。如果在索引中避免了别名(通过使用物理地址进行索引或通过操作系统保证别名在索引中具有相同的位(页面着色)),则只需探测一个集合。通过将任何检测到的同义词重新定位到最近使用的虚拟地址指示的集合,将来就可以避免别名(直到发生同一物理地址的不同映射)。

在没有索引别名的直接映射虚拟标记缓存中,可以进一步简化。由于潜在的同义词将与请求冲突并被逐出,因此可以在处理缓存未命中之前对脏行进行任何必要的写回(因此同义词将位于内存或物理寻址的高级缓存中),或者可以在安装从内存(或高级缓存)中提取的缓存行之前探测物理寻址的写回缓冲区。无需检查未修改的别名,因为内存内容将与缓存中的内容相同,仅执行不必要的未命中处理。这避免了对整个缓存的额外物理标记的需求,并允许转换相对较慢。

如果无法保证避免索引中的别名,那么即使是物理标记的缓存也需要检查可能包含别名的其他集合。(对于索引的一个非物理位,在单个替代集合中对缓存进行第二次探测可能是可以接受的。这类似于伪关联性。)

对于虚拟标记的缓存,可以提供一组额外的物理地址标记。这些标记仅在未命中时被访问,可用于 I/O 和多处理器缓存一致性。(由于未命中和一致性请求都相对罕见,因此这种共享通常不会有问题。)

AMD 的 Athlon 使用物理标记和虚拟索引,为一致性探测和别名检测提供了一组单独的标记。由于索引使用三个虚拟地址位,因此在未命中时必须探测七个备选集以查找可能的别名。由于这可以在等待 L2 缓存的响应时完成,因此这不会增加延迟,并且额外的一组标记还可用于一致性请求,鉴于 L2 缓存的独占性,一致性请求更为频繁。

对于大型虚拟索引 L1 缓存,除了探测许多附加集之外,另一种方法是提供物理到虚拟的转换缓存。在未命中(或一致性探测)时,物理地址将被转换为可能在缓存中使用的虚拟地址。由于为每个缓存行提供转换缓存条目是不切实际的,因此需要一种方法来在转换被逐出时使缓存行无效。

如果保证不会发生别名(至少是可写地址的别名),例如在典型的单地址空间操作系统中,那么虚拟寻址缓存的唯一缺点是由于此类系统中的虚拟地址大于物理地址而产生的额外标签开销。为单地址空间操作系统设计的硬件可以使用权限后备缓冲区而不是转换后备缓冲区,从而将转换延迟到最后一级缓存未命中。


1倾斜关联性使用不同的哈希对缓存的不同路进行索引,所用位数多于对相同大小的路进行模数索引所需的位数。这对于减少冲突未命中非常有用。这可能会引发别名问题,而这在大小和关联性相同的模数索引缓存中不会出现。

相关内容