缓存一致性

17 Mar 2025 | 6 分钟阅读

本文将讨论缓存一致性协议,作为解决多缓存不一致问题的方案。

缓存一致性

缓存一致性问题是由于多个处理器并发操作,并且各种缓存可能持有相同内存块的不同版本而产生的。缓存一致性实践确保相关操作数的内容更改能够快速地在系统各处传播。

缓存一致性问题是指当同一数据的多个副本存储在不同内存层级时出现的问题。

缓存一致性有三个不同的级别

  • 每次写入操作似乎都是立即发生的。
  • 每个操作数的值变化以完全相同的顺序在所有处理器中可见。
  • 多个处理器以不同的方式解释相同的操作会导致非一致性行为。
Cache Coherence

解决缓存一致性的方法

以下两种方法可用于解决缓存一致性问题

  • 写直通(Write Through)
  • 写回(Write Back)

写直通(Write Through)

最简单也是最流行的方法是写直通。每次内存写入操作都会更新主内存。如果请求地址的字存在于缓存内存中,则缓存内存也会与主内存同时更新。

这种方法的好处是 RAM 和缓存始终包含相同的信息。在具有直接内存访问传输的系统中,此质量至关重要。它确保主内存中的信息始终是最新的,以便通过 DNA 交互的设备可以访问最新信息。

优点 - 它提供了最高级别的一致性。

缺点 - 它需要更多的内存访问。

写回(Write Back)

在此方法中,只有缓存位置在写入操作期间会被更改。当该字从缓存中移除时,该位置会被标记,以便将其复制到主内存中。写回方法之所以被开发出来,是因为字在缓存中时可能会被更新多次。然而,只要它们还在缓存中,主内存中存储的副本是否过时并不重要,因为对字的请求是从缓存中满足的。

只有当字从缓存中移除时,才必须将精确的副本写回主内存。根据分析结果,在正常程序中,10% 到 30% 的内存引用会被写入内存。

优点 - 内存访问和写入操作非常少。

缺点 - 此方法可能会出现不一致。

与存储在缓存和主内存中的数据或信息相关的重要术语如下

  • 已修改 (Modified) - 已修改术语表示存储在缓存和主内存中的数据不同。这意味着缓存中的数据已被修改,并且需要将更改反映到主内存中。
  • 独占 (Exclusive) - 独占术语表示数据是干净的,即缓存和主内存存储相同的数据。
  • 共享 (Shared) - 共享是指缓存值包含最新的数据副本,该副本然后会在整个缓存和主内存中共享。
  • 拥有 (Owned) - 拥有术语表示该块当前由缓存持有,并且它已获得该块的所有权,即对该特定块的完全权限。
  • 无效 (Invalid) - 当缓存块被标记为无效时,表示需要从另一个缓存或主内存中获取。

以下是多处理器系统中使用的不同缓存一致性协议列表

  • MSI 协议(修改、共享、无效)
  • MOSI 协议(修改、拥有、共享、无效)
  • MESI 协议(修改、独占、共享、无效)
  • MOESI 协议(修改、拥有、独占、共享、无效)

这些协议将在下面讨论

1. MSI 协议

这是一种基本的缓存一致性机制,用于多处理器系统。缓存可以处于协议名称字母所指示的任何状态。因此,对于 MSI,每个块可以处于以下状态之一

  • 已修改 (Modified) - 换句话说,缓存中的数据与主内存不兼容,此状态表示块已在缓存中更新。因此,当缓存块中的数据被移除并且处于修改(M)状态时,缓存负责将块写回主内存。
  • 共享 (Shared) - 至少一个缓存拥有该块的至少一个副本,并且该副本未被更新。在不将数据写回备份存储的情况下,可以移除缓存。
  • 无效 (Invalid) - 如果要将此块存储在此缓存中,必须从 RAM 或其他缓存获取,因为它无效。

2. MOSI 协议

它比 MSI 协议多一个状态,如下所述

拥有 (Owned) - 它用于表示当前处理器对该块的所有权,并在另一个处理器想要该块时响应查询。

3. MESI 协议

这是最常用的缓存一致性协议。每个缓存行都带有指示以下状态之一的状态

  • 已修改 (Modified) - 如上所述,此术语表示存储在缓存和主内存中的数据不同。这意味着缓存中的数据已被修改,并且需要将更改反映到主内存中。
  • 独占 (Exclusive) - 独占术语表示数据是干净的,即缓存和主内存存储相同的数据。
  • 共享 (Shared) - 这表示计算机上的其他缓存也可能拥有此缓存行。
  • 无效 (Invalid) - 这表示此缓存行被“无效”一词标记为无效。

4. MOESI 协议

该协议提供了全面的缓存一致性,涵盖了其他协议中经常使用的所有潜在状态。每个缓存行都具有以下状态之一

  • 已修改 (Modified) - 虽然主内存中的副本不准确,并且没有其他处理器持有副本,但处于此状态的缓存行包含数据最新、最准确的副本。
  • 拥有 (Owned) - 数据的最新、最准确的副本存储在处于此状态的缓存行中。其他处理器可以存储最新、最准确数据副本(类似于共享状态);与共享状态不同,主内存中的副本可能不准确。一次只能有一个处理器拥有数据,而其他处理器可以以共享状态拥有该数据。
  • 独占 (Exclusive) - 数据的最新、最准确的副本存储在处于此状态的缓存行中。由于没有其他存储位置拥有该数据的副本,因此 RAM 副本也是最新、最准确的副本。
  • 共享 (Shared) - 数据的最新、最准确的副本存储在处于此状态的缓存行中。其他系统处理器也可能以共享状态存储数据副本。如果没有其他处理器拥有该数据,主内存中的副本也代表了数据的最新、最准确的版本。
  • 无效 (Invalid) - 在这种情况下,缓存行不包含数据的可靠副本。然而,有效数据可以在主内存或其他处理器的缓存中找到。

一致性类型

存在三种称为一致性机制的一致性,如下所述

  1. 基于目录 (Directory Based) - 基于目录的系统通过将共享数据存储在单个目录中来保持缓存之间的一致性。为了将条目从主内存加载到其缓存中,处理器必须通过作为过滤器的目录请求权限。当修改了某个条目时,目录会升级或贬值包含该记录的其他缓存。
  2. 侦听 (Snooping) - 在侦听过程中,单个缓存会监视地址线,以查找对其缓存的内存位置的访问。这被称为写无效协议。当检测到对缓存维护副本的内存地址进行写入活动时,缓存控制器会使其自身对被侦听的内存位置的副本无效。
  3. 嗅探 (Snarfing) - 缓存控制器使用此方法,通过监视地址和内容来尝试更新内存位置自身副本,当第二个主控器更改主内存中的某个位置时。当检测到对缓存拥有副本的位置的写入活动时,缓存控制器会使用新数据更新其底层内存位置的自身副本。

下一主题EHCI