学习空间

缓存一致性协议

2022-06-23  本文已影响0人  Zeppelin421

锁缓存行有一套协议叫做缓存一致性协议。缓存一致性协议有MSI、MESI、MOSI、Synapse、Firefly以及DragonProtocol等等。

MESI

MESI分别代表缓存行数据的4中状态,通过对这四种状态的切换,来达到对缓存数据进行管理的目的


状态 描述 监听任务
Modified
(修改)
该Cache Line有效,数据被修改了,和内存中的数据不一致,数据只存在于本Cache中 Cache Line必须时刻监听所有试图读该Cache Line相对应的内存的操作,其他缓存须在本Cache Line写回内存并将状态置为E之后才能操作该Cache Line对应的内存数据
Exclusive
(互斥)
该Cache Line有效,数据和内存中的数据一致,数据只存在于本Cache中 Cache Line 必须监听其他缓存读主内存中该Cache Line相对应的内存的操作,一旦有这种操作,该Cache Line需要变成S状态
Shared
(共享)
该Cache Line有效,数据和内存中的数据一致,数据同时存在于其他缓存中 Cache Line必须监听其他处理器修改该Cache Line相对应的本地Cache Line的操作,一旦有这种操作,该Cache Line需要变成 I 状态
Invalid
(无效)
该Cache Line数据无效

多核缓存协同操作

假设有三个CPU-A、B、C,对应三个缓存分别是cache-a、b、c。在主内存中定义了x的引用值0


单核读取


多核读取
同步数据

MESI优化和引入的问题:各CPU缓存行的状态是通过消息传递来进行的。如果CPU0要对一个在缓存中共享的变量进行写入,首先需要发送一个失效的消息给到其他缓存了该数据的CPU,并且要等到他们的确认回执。CPU0在这段时间内都会一直处于阻塞状态,会导致各种各样的性能问题和稳定性问题。

MESI性能优化

Store Buffer

为了避免阻塞带来的资源浪费,在CPU中引入了Store Buffer。

CPU在写入共享数据时,直接把数据写入到Store Buffer中,同时发送Invalidate消息,然后继续去处理其他指令。当收到其他所有CPU发送了Invalidate Acknowledge消息时,再将Store Buffer中的数据存储到Cache Line中,最后再从Cache Line同步到主内存。


Store Buffer的问题:引入了Store Buffer后,CPU会优先从Store Buffer中读取数据,这在一些情况下会导致CPU的乱序执行,也可以认为是一种重排序,这种重排序会带来可见性问题

Store Forwarding

Write Memory Barrier

Invalidate Queue

上一篇 下一篇

猜你喜欢

热点阅读