19.硬件层的MESI协议原理

硬件层的MESI协议原理

为了缓解内存 和 CPU之间的速度差的问题, 现在计算机会在CPU上增加缓存,每个CPU内核都有自己的L1和L2高速缓存,CPU芯片上的CPU内核共享一个L3缓存

每个CPU的处理过程为:

  • 先将计算需要用到的数据缓存在CPU高速缓存中
  • CPU进行计算时,直接从高速缓存中读取数据并且计算完成后写入高速缓存
  • 运算结束,将高速缓存中的数据同步到主存

但是每个线程可能会运行不同的CPU内核,因此每个线程都拥有自己的高速缓存,同一份数据可能会被缓存到多个CPU内核中,在不同的CPU内核中运行的线程可以看到同一个变量缓存的值就会不一样,这样就会存在内存可见性问题!!!

MESI协议(Modified, Exclusive, Shared, Invalid)是一种缓存一致性协议,用于解决多处理器系统中缓存的数据一致性问题,其中的核心目标之一就是确保内存可见性。在多核系统中,每个核心都有自己的缓存,而且它们之间共享主存。当一个核心修改了缓存中的数据时,必须确保其他核心能够及时看到这个修改,否则就会导致数据的不一致性。

MESI协议通过四种状态来管理缓存行:

  1. Modified(修改):表示该缓存行已被修改,与内存中的数据不一致。
  2. Exclusive(独占):表示该缓存行只存在于当前核心的缓存中,与主存中的数据一致。
  3. Shared(共享):表示该缓存行被多个核心共享,与主存中的数据一致。
  4. Invalid(无效):表示该缓存行无效,即不包含有效的数据。

当一个核心要读取或写入某个缓存行时,MESI协议会根据当前缓存行的状态和操作的类型来进行相应的状态转换。例如,当一个核心要写入一个缓存行时,如果该缓存行处于Shared状态,那么该缓存行会被置为Invalid状态,其他核心的缓存也会失效,确保其他核心读取到的数据是最新的。

1.总线锁和缓存锁

为了解决内存可见性问题,CPU主要提供了两种解决方式

  • 总线锁
  • 缓存锁

1.1.总线锁

操作系统提供了总线锁定机制,前端总线(也叫做CPU总线),是所有CPU与芯片组连接的主干道,负责CPU和外界所有的部件进行通信,包括高速缓存内存北桥,其控制总线向各个部件发送控制信号通过地址总线发送地址信号指定其要访问的部件通过数据总线双向传输

当Core-1内核需要Core-1 需要执行 a++操作的时候,这个时候将会在总线上发出一个 LOCK# 信号锁定缓存(具体来说是变量所在缓存行)这样其他的CPU内核就不能操作缓存了(其他内核被阻塞了),这样Core-1就可以独享此共享内存。

当Core-2去访问L3缓存中的数据时候,会通过总线来进行读取,总线中 有一把总线锁,当不同的CPU访问的时候,会在总线上发出一个 LOCK#信号,此时的Core-2访问时,需要等到Core-1访问完毕,释放总线锁,Core-2才能访问。

在这里插入图片描述

总线锁的缺点:在多核CPU架构中,总线锁会在多个CPU之间引发通信和同步问题,导致性能下降。这是因为当某个CPU使用总线锁时,它会锁住整个系统的总线,阻止其他CPU对其他内存地址的访问,这就限制了并行性。此外,总线锁的粒度比较大,因为它锁住了整个总线,即使只有很小一部分数据需要同步,也会导致其他CPU无法访问其它内存地址,这种粗粒度的锁会带来额外的开销。

针对这些问题,Intel 486之后的CPU提供了一种新的优化缓存锁(Cache Lock)提供了一种更细粒度的锁机制。缓存锁通过利用处理器缓存来实现同步,而不是直接锁住总线。每个处理器都有自己的缓存,当一个处理器需要访问内存时,它首先会查看自己的缓存中是否存在所需数据,如果存在,就可以直接从缓存中读取,而不需要通过总线访问主存。当多个处理器同时访问同一块内存时,它们可能会在各自的缓存中拷贝这块内存的副本,这就可能导致缓存一致性问题。为了解决这个问题,缓存锁会在需要同步的时候,通过处理器间的缓存一致性协议来保证数据的一致性,而不是像总线锁那样直接锁住整个总线。

1.2.缓存锁

相比于总线锁,缓存锁降低了锁的粒度。为了达到数据访问的一致,需要各个CPU在访问的时候遵循一些协议,在存取数据的时候根据这些协议来进行操作,常见的协议有 MSI,MESI,MOSI等,最常见的就是MESI协议。

缓存一致性机制就是,当某个CPU对高速缓存中的数据进行操作之后,通知其他CPU放弃存储在他们内部的缓存数据,或者从主存中重新读取**

在这里插入图片描述

为了提高处理速度,CPU不直接和主存直接通信,而是先将系统主存的数据写到高速缓存中(L1,L2或者其他),但操作完成并不知道什么时候写入到内存,如果声明了volatile的变量进行写操作JVM会想处理器发送一条Lock前缀指令,然后将这个变量所在缓存行的数据写入到系统主存

但是,即使我们写入到系统主存,其他CPU的高速缓存的值还是旧的,再执行计算操作也会有问题,所以在多核心的CPU系统中,为了保证各个CPU的高速缓存的数据的一致性,会实现缓存一致性协议,每个CPU通过嗅探总线上的传播的数据来检查自己的高速缓存中的值是否会过期,当CPU发现自己缓存行对应的地址被修改后,会将当前CPU的缓存行设置为无效状态,当CPU对这个数据进行修改操作时,会重新从系统主存中把数据读到高速缓存中

缓存一致性的主要写入方法有一下两种

  • Write-Through(直写模式)
  • Write-Back(回写模式)
写入方法描述优点缺点
Write-Through(直写模式)在写入操作时,同时将数据写入缓存和主存。数据一致性较好,因为写入操作会立即更新到主存。
可以避免丢失数据,因为数据一直存在于主存中。
写入操作的延迟较高,因为需要等待数据同时写入缓存和主存。
写入次数增加,因为每次写入都需要写入缓存和主存,增加了总线和内存的负载。
Write-Back(回写模式)在写入操作时,只将数据写入缓存,而不是立即写入主存。只有在缓存行被替换时才会将其写回主存。写入操作的延迟较低,因为只需要写入缓存,无需等待主存写入。
减少了总线和内存的负载,因为只有在缓存行被替换时才会写回主存。
数据一致性较差,因为写入的数据不会立即更新到主存,可能导致缓存中的数据和主存中的数据不一致。
在缓存行被替换时,会导致额外的写回操作,增加了总线和内存的负载。

注意:缓存行时高速缓存操作的基本单位,在Intel的CPU上一般是64字节。

2.缓存一致性协议

主要的缓存一致性协议有 MSI协议 和 MESI协议等

2.1.MSI协议

多核心CPU都有自己专属的高速缓存(L1、L2),以及同一个CPU芯片板上的不同CPU内核共享的高速缓存(一般为L3)。不同CPU内核的高速缓存中避免加载同样数据,那么就会使用缓存一致性协议。

MSI(Modified, Shared, Invalid)是一种常见的缓存一致性协议,用于确保多核CPU中的各个核心的缓存中的数据的一致性。在MSI协议中,每个缓存行都有三种状态:Modified(已修改)、Shared(共享)、Invalid(无效)。

  • Modified(已修改):表示缓存行中的数据已被修改,并且该数据与主存中的数据不一致。这意味着该缓存行是这个核心独占的,其他核心无法访问该数据。
  • Shared(共享):表示缓存行中的数据与主存中的数据一致,并且该数据可能被其他核心缓存中的缓存行共享。这意味着该数据可以被其他核心读取,但不能被修改。
  • Invalid(无效):表示缓存行中的数据无效,即不包含有效的数据。当某个核心修改了一个缓存行中的数据时,该缓存行的状态会变为Invalid,其他核心的缓存中相应的缓存行也会变为Invalid,以确保缓存一致性。

在MSI协议中,当一个核心要读取或写入一个缓存行时,它必须首先检查该缓存行的状态:

  • 如果缓存行状态为Shared,表示数据可共享,该核心可以直接读取数据,不需要向其他核心发送任何请求。
  • 如果缓存行状态为Modified,表示该数据已被修改,其他核心可能拥有该数据的共享副本,此时该核心必须将数据写回主存并将缓存行的状态设置为Shared,然后才能读取或写入该数据。
  • 如果缓存行状态为Invalid,表示该数据无效,该核心需要向其他核心发送一个读取请求或者写入请求,以获取有效的数据或者更新主存中的数据,并将缓存行的状态设置为Shared或者Modified。

MSI协议通过这种方式确保了多核CPU中各个核心缓存中数据的一致性,保证了多核系统中的并发操作的正确性和可靠性

简单来说,如果同时有多个CPU要写入,总线会进行串行化,同一时刻只会有一个CPU获得访问权。

在这里插入图片描述

在这里插入图片描述

2.2.MESI协议的RFO请求

目前主流缓存一致性协议是 MESI写入失效协议,而MESI协议是MES协议的拓展。在MESI协议中,每个缓存行有4种状态 M(Modified) E(Exclusive)

S(Share) I(Invalid) 每个状态 占 2位

该协议要求在每个缓存行上维护2个状态位,使得每个单位处于 M E S I 这四种状态之一

2.2.1.M(Modified 被修改)

该缓存行的数据,只在本CPU的私有高速缓存中进行了缓存,而其他CPU是没有的,是被修改的过的 脏数据,当前数据 和 主存数据是不一致的,且没有更新到主存中。该缓存行需要在未来的某个时间节点(其他CPU读取主存数据中,这些被修改的数据前)写到主存。当被写回主存后,该缓存行的状态变为独享状态(Exclusive)

2.2.2.E(Exclusive 独享的)

该缓存行的数据只在本CPU的私有高速缓存中进行缓存,其他CPU没有,缓存行的数据是未被修改的,并且和主存数据一致。

该状态下的缓存行,在任何时刻被其他CPU读取后,状态会变为共享状态(Shared)

如果CPU对数据进行修改,状态会转为 被修改(Modified)状态

2.2.3.S(Share 共享的)

该缓存行的数据可能在本CPU以及其他CPU的私有的高速缓存中进行缓存,并且在各个CPU私有高速缓存的数据 和 主存数据一致,当一个CPU修改该缓存行,其他CPU该缓存行的数据将被作废,变成无效状态。

2.2.4.I(Invalid 无效的)

该缓存行是无效的,可能其他CPU修改了缓存行

2.2.4.M-E-S-I状态转换

下面是一个状态变化的一个简单案例图

在这里插入图片描述

在这里插入图片描述

下面,分阶段说明一下 这四种状态如何进行转换的

  • **初始状态:**开始时,缓存行没有加载任何数据,所以它处于 I(无效状态)
  • **本地写(Local Write)阶段:**如果CPU内核写数据处于 I(无效状态) 的缓存行,那么缓存行状态会变为 M(被修改状态)
  • **本地读(Local Read)阶段:**如果CPU处于 I(无效状态) 的缓存行,很明显此缓存没有数据给他, 此时分为两种情况
    1. 其他处理器的缓存行中也没有此数据,那么从主存中加载此缓存行,变为 E(独享状态),只有我自己有
    2. 其他的处理缓存中有此数据,就将此缓存行状态设置为 S(共享状态),注意处于 M(修改状态)的缓存行,再由本地CPU写入/读出,状态是不会发生改变的
  • **远程读(Remote Read)阶段:**例如 Core-2 想读取 Core-1的内容,Core-1需要将他的的缓存行内容通过主控制器(Memory Controller)发送给Core-2,Core-2接收到相应数据,并将缓存行设置为 S(共享状态)。在此之前,主存要从总线上获取这份数据并保存
  • **远程写(Remote Write)阶段:**Core-2 获取的Core-1的数据后,Core-2获取的目的不是读,而是写,此时有一个问题Core-1也有这份数据拷贝,这个是时候如何解决呢?其实Core-2在这里将会发出一个RFO(Request For Owner)请求,说明他需要拥有这行数据的权限,其他CPU相应的缓存行状态设置位 I(无效的),除了Core-2谁也不能动这份数据。保证了数据安全。但是处理RFO请求和设置`I(无效的) 状态会带来很大性能消耗
  • 远程写大概流程如下
    1. 检查状态:处理器首先检查要写入的缓存行的状态。如果状态是Modified(已修改)Exclusive(独占),则表示该缓存行已经在当前处理器的缓存中,并且没有被其他处理器缓存或修改。这种情况下,写操作可以直接在该处理器的缓存中进行,不需要远程写。
    2. 发送信号:如果要写入的缓存行处于Shared(共享)状态,则表示其他处理器也可能拥有这个缓存行,因此需要进行远程写。当前处理器会发送一个信号给拥有该缓存行的其他处理器,告知它们需要更新自己的缓存行。
    3. 等待响应:其他处理器收到信号后,会根据MESI协议执行相应的操作。如果某个处理器的缓存中存在要修改的缓存行,它会将自己的缓存行状态设置为Invalid(无效),表示当前缓存行已经过时,需要从主存中重新加载最新数据。
    4. 更新缓存:一旦其他处理器的缓存行状态更新为Invalid(无效),当前处理器就可以将要写入的数据加载到自己的缓存行中,并将缓存行状态设置为Modified(已修改)Exclusive(独占),表示当前缓存行是该处理器独占的或者已被修改。

在MESI协议中,每个CPU内核的缓存控制器不仅知道自己的读写操作,而且也监听其他CPU内核缓存控制器的读写操作。各缓存通过状态转换机制(状态机)来实现数据一致性。

MESI协议在带来的性能问题

  1. 缓存一致性开销:MESI协议需要处理器在读写缓存时进行状态的检查和更新,以保证缓存的一致性。这些额外的操作会增加处理器的开销,包括处理器之间的通信开销、状态更新开销等,从而降低了整体系统的性能。
  2. 缓存行失效:当一个处理器修改了一个缓存行的数据时,该缓存行在其他处理器的缓存中将被标记为Invalid(无效),表示需要从主存中重新加载最新数据。这种缓存行的失效会导致其他处理器在访问该缓存行时发生缓存失效,从而增加了访存延迟,降低了系统的性能。
  3. 缓存行迁移:在MESI协议中,当一个处理器将一个缓存行的状态从Shared(共享)变为Modified(已修改)或Exclusive(独占)时,需要将该缓存行的数据迁移到自己的缓存中。这种缓存行的迁移操作会消耗额外的带宽和资源,并且可能导致其他处理器的缓存行失效,从而增加了系统的开销和延迟。
  4. 处理器间通信延迟:为了保持缓存的一致性,MESI协议需要处理器之间进行频繁的通信和协调,包括发送信号、等待响应等。这种处理器间的通信会引入额外的延迟,影响了系统的响应速度和性能表现。
  • 48
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值