缓存一致性和同步
在本章中,我们将讨论缓存一致性协议来应对多缓存不一致问题。
缓存一致性问题
在多处理器系统中,存储器层次结构的相邻级别之间或同一级别内可能会出现数据不一致。例如,高速缓存和主存储器可能具有同一对象的不一致副本。
由于多个处理器并行操作,并且多个高速缓存独立地可能拥有同一内存块的不同副本,这会产生高速缓存一致性问题。缓存一致性方案通过为每个缓存的数据块维护统一的状态来帮助避免此问题。
令 X 为已被两个处理器 P1 和 P2 引用的共享数据元素。一开始,X 的三个副本是一致的。如果处理器P1将新数据X1写入高速缓存,则通过使用直写策略,相同的副本将立即写入共享存储器。在这种情况下,高速缓冲存储器和主存储器之间会出现不一致。当使用回写策略时,当缓存中的修改数据被替换或失效时,主存将被更新。
一般来说,不一致问题有三个来源 -
- 共享可写数据
- 进程迁移
- 输入/输出活动
史努比总线协议
Snoopy协议通过基于总线的内存系统实现高速缓存和共享内存之间的数据一致性。写无效和写更新策略用于维护缓存一致性。
在这种情况下,我们有三个处理器 P1、P2 和 P3,它们在本地高速缓存和共享内存中具有数据元素“X”的一致副本(图-a)。处理器 P1 使用写入无效协议将 X1 写入其高速缓冲存储器中。因此,所有其他副本都通过总线失效。它用“I”表示(图-b)。无效的块也称为脏块,即不应使用它们。写更新协议通过总线更新所有缓存副本。通过使用回写缓存,内存副本也会更新(图-c)。
缓存事件和操作
执行内存访问和失效命令时会发生以下事件和操作 -
读取未命中- 当处理器想要读取一个块但该块不在缓存中时,就会发生读取未命中。这将启动总线读取操作。如果不存在脏副本,则具有一致副本的主存储器向请求高速缓冲存储器提供副本。如果远程高速缓冲存储器中存在脏副本,则该高速缓冲存储器将限制主存储器并将副本发送到请求高速缓冲存储器。在这两种情况下,缓存副本都会在读取未命中后进入有效状态。
Write-hit - 如果副本处于脏或保留状态,则写入在本地完成,并且新状态是脏的。如果新状态有效,则写入无效命令将广播到所有缓存,使它们的副本无效。当共享内存被写透时,结果状态在第一次写入后被保留。
Write-miss - 如果处理器无法写入本地缓存,则副本必须来自主内存或带有脏块的远程缓存。这是通过发送读取无效命令来完成的,该命令将使所有缓存副本无效。然后本地副本会更新为脏状态。
读命中- 读命中始终在本地缓存中执行,不会导致状态转换或使用窥探总线进行失效。
块替换- 当副本脏时,将通过块替换方法将其写回主存储器。但是,当副本处于有效或保留或无效状态时,不会进行替换。
基于目录的协议
通过使用多级网络构建具有数百个处理器的大型多处理器,需要修改监听缓存协议以适应网络功能。在多级网络中执行广播的成本非常高,一致性命令仅发送到那些保留块副本的缓存。这就是为网络连接的多处理器开发基于目录的协议的原因。
在基于目录的协议系统中,要共享的数据被放置在一个公共目录中,该目录保持缓存之间的一致性。在这里,目录充当过滤器,处理器在其中请求许可将条目从主存储器加载到其高速缓存存储器。如果某个条目发生更改,则目录会更新该条目或使包含该条目的其他缓存失效。
硬件同步机制
同步是一种特殊的通信形式,其中不是数据控制,而是在驻留在相同或不同处理器中的通信进程之间交换信息。
多处理器系统使用硬件机制来实现低级同步操作。大多数多处理器都有硬件机制来强制执行Atomics操作,例如内存读取、写入或读取-修改-写入操作,以实现一些同步原语。除了Atomics内存操作之外,一些处理器间中断也用于同步目的。
共享内存机器中的缓存一致性
当处理器包含本地高速缓冲存储器时,维持高速缓存一致性是多处理器系统中的一个问题。该系统中很容易出现不同缓存之间数据不一致的情况。
主要关注领域是 -
- 共享可写数据
- 进程迁移
- 输入/输出活动
共享可写数据
当两个处理器(P1 和 P2)的本地缓存中有相同的数据元素(X)并且一个进程(P1)写入该数据元素(X)时,由于缓存是 P1 的直写式本地缓存,因此主存是也更新了。现在,当 P2 尝试读取数据元素 (X) 时,它找不到 X,因为 P2 的缓存中的数据元素已过时。
进程迁移
在第一阶段,P1的缓存有数据元素X,而P2没有任何数据。P2 上的进程首先写入 X,然后迁移到 P1。现在,该进程开始读取数据元素X,但由于处理器P1具有过时的数据,该进程无法读取它。因此,P1 上的进程写入数据元素 X,然后迁移到 P2。迁移后,P2 上的进程开始读取数据元素 X,但它在主内存中发现 X 的过时版本。
输入/输出活动
如图所示,在双处理器多处理器架构中,I/O 设备被添加到总线上。一开始,两个缓存都包含数据元素X。当I/O设备接收到新元素X时,它直接将新元素存储在主存储器中。现在,当 P1 或 P2(假设 P1)尝试读取元素 X 时,它会得到一个过时的副本。因此,P1 写入元素 X。现在,如果 I/O 设备尝试传输 X,它会得到一个过时的副本。
统一内存访问 (UMA)
统一内存访问(UMA)架构意味着系统中所有处理器的共享内存都是相同的。通常用于(文件)服务器的流行的 UMA 机器类别是所谓的对称多处理器 (SMP)。在 SMP 中,处理器可以以统一的方式访问所有系统资源,如内存、磁盘、其他 I/O 设备等。
非统一内存访问 (NUMA)
在NUMA架构中,有多个具有内部间接/共享网络的SMP集群,它们在可扩展的消息传递网络中连接。所以,NUMA架构是逻辑上共享物理上分布式内存的架构。
在 NUMA 机器中,处理器的高速缓存控制器确定内存引用对于 SMP 内存来说是本地的还是远程的。为了减少远程内存访问的次数,NUMA架构通常应用可以缓存远程数据的缓存处理器。但是当涉及到缓存时,就需要保持缓存的一致性。所以这些系统也被称为CC-NUMA(Cache Coherent NUMA)。
仅高速缓存内存架构 (COMA)
COMA 机器与 NUMA 机器类似,唯一的区别是 COMA 机器的主存储器充当直接映射或组关联缓存。数据块根据其地址散列到 DRAM 缓存中的某个位置。远程获取的数据实际上存储在本地主存储器中。而且,数据块没有固定的归属位置,它们可以在整个系统中自由移动。
COMA 架构大多具有分层消息传递网络。这种树中的交换机包含一个目录,该目录具有作为其子树的数据元素。由于数据没有起始位置,因此必须显式搜索它。这意味着远程访问需要沿着树中的交换机进行遍历,以在其目录中搜索所需的数据。因此,如果网络中的交换机从其子树接收到对相同数据的多个请求,它会将这些请求组合成一个请求,然后发送到交换机的父级。当请求的数据返回时,交换机将其多个副本发送到其子树中。
COMA 与 CC-NUMA
以下是 COMA 和 CC-NUMA 之间的差异。
COMA 往往比 CC-NUMA 更灵活,因为 COMA 透明地支持数据迁移和复制,而不需要操作系统。
COMA 机器的构建昂贵且复杂,因为它们需要非标准内存管理硬件,并且一致性协议更难实现。
COMA 中的远程访问通常比 CC-NUMA 中的远程访问慢,因为需要遍历树形网络来查找数据。