关于MESI的一些事
MESI:最终一致性
- M(Modified):代表该缓存行中的内容被修改了,并且该缓存行只被缓存在该CPU中。这个状态的缓存行中的数据和内存中的不一样,在未来的某个时刻它会被写入到内存中(当其他CPU要读取该缓存行的内容时。或者其他CPU要修改该缓存对应的内存中的内容时
- 当我们要修改变量时,需要等待B-CPU将变量S变为I,也就是等待ACK响应,当A-CPU收到B响应时才能将变量进行修改
- 以此引入Store Buffer
- E(Exclusive):代表该缓存行对应内存中的内容只被该CPU缓存,其他CPU没有缓存该缓存对应内存行中的内容。
- S(Shared):该状态意味着数据不止存在本地CPU缓存中,还存在别的CPU的缓存中。这个状态的数据和内存中的数据是一致的。
- I(Invalid):代表该缓存行中的内容是无效的
Store Buffer
- 有了Store Buffer,A-CPU便可以直接修改S变量,然后交给Store Buffer来等待ACK的响应,当收到确认后便可以将变量写入A-CPU本地缓存
- 但是,Store Buffer的存储大小是有限的,我们无法将大量变量都存进Store Buffer中等待ACK的确认,因此我们需要引入失效队列
失效队列
- 有了失效队列,Store Buffer中的变量便能够在失效消息被投入B中时,便可以收到ACK的确认,等到B-CPU空闲下来后便可以去消费失效队列中的消息
指令重排
- 我们所熟悉的指令重排便是由于这两个缓存导致的,比如我们对A、B进行修改,但是B先投入到失效队列中导致B变量先被放入本地缓存中,这也会导致可见性问题
- 读写屏障便是屏蔽这两个队列
- 写屏障必须要我们在进行写操作前,将所有失效变量刷入失效队列中
- 读屏障则是要求CPU在读操作之前,将失效队列中的所有消息进行消费,之后再去读变量
总线嗅探机制
CPU和内存通过总线(BUS)互通消息。CPU感知其他CPU的行为(比如读、写某个缓存行)就是是通过嗅探(Snoop)线性中其他CPU发出的请求消息完成的,有时CPU也需要针对总线中的某些请求消息进行响应。这被称为”总线嗅探机制“。
嗅探风暴
当我们对一个变量或多个进行频繁修改时,便会不断的引发嗅探机制的触发,导致CPU总线资源消耗过高,这便是嗅探风暴
关于MESI的一些事
http://lzhnet.top/2023/06/28/关于MESI的一些事/