当前位置:网站首页>全面理解MESI缓存一致性协议
全面理解MESI缓存一致性协议
2022-06-29 09:28:00 【玄郭郭】
目录
MESI缓存一致性协议
多核CPU多级缓存一致性协议MESI
多核CPU的情况下有多个一级缓存,如何保证缓存内部数据的一致,不让系统数据混乱。这里就引出了一个一致性的协议MESI。
MESI协议缓存状态
MESI 是指4中状态的首字母。每个Cache line(缓存行(Cache line):缓存存储数据的单元)。有4个状态,可用2个bit表示,它们分别是:Modidied(修改),Exclusive(独享),Shared(共享),Invalid(无效)。

注意:
对于M和E状态而言总是精确的,他们在和该缓存行的真正状态是一致的,而S状态可能是非一致的。如果一个缓存将处于S状态的缓存行作废了,而另一个缓存实际上可能已经独享了该缓存行,但是该缓存却不会将该缓存行升迁为E状态,这是因为其它缓存不会广播他们作废掉该缓存行的通知,同样由于缓存并没有保存该缓存行的copy的数量,因此(即使有这种通知)也没有办法确定自己是否已经独享了该缓存行。
从上面的意义看来E状态是一种投机性的优化:如果一个CPU想修改一个处于S状态的缓存行,总线事务需要将所有该缓存行的copy变成invalid状态,而修改E状态的缓存不需要使用总线事务。
缓存行Cache line是有64byte,如果数据缓存行放不下,就得切换成总线锁。
总线锁:有参数变化,就得通过BUS总线。比如CPU A和CPU B同时要更新一个值,都必须必须先通过总线锁,总线锁会来统一处理,这样效率就会很低。
下面画一个大致的流程图:



MESI优化和他们引入的问题
缓存的一致性消息传递是要时间的,这就使其切换时会产生延迟。当一个缓存被切换状态时其他缓存收到消息完成各自的切换并且发出回应消息这么一长串的时间中CPU都会等待所有缓存响应完成。可能出现的阻塞都会导致各种各样的性能问题和稳定性问题。
CPU切换状态阻塞解决
存储缓存(Store Bufferes)
比如你需要修改本地缓存中的一条信息,那么你必须将I(无效)状态通知到其他拥有该缓存数据的CPU缓存中,并且等待确认。等待确认的过程会阻塞处理器,这会降低处理器的性能。因为这个等待远远比一个指令的执行时间长的多。
Store Bufferes
为了避免这种CPU运算能力的浪费,Store Bufferes被引入使用。处理器把它想要写入到主存的值写到缓存,然后继续去处理其他事情。当所有失效确认(Invalidate Acknowledge)都接收到时,数据才会最终被提交。
这么做有两个风险,Store Bufferes的风险
第一、就是处理器会尝试从存储缓存(Store buffer)中读取值,但它还没有进行提交。这个的解决方案称为Store Forwarding,它使得加载的时候,如果存储缓存中存在,则进行返回。
第二、保存什么时候会完成,这个并没有任何保证。
我同事问了我一个比较有意思的问题,就是既然有了缓存一致性,那为什么我们还需要lock呢?
我大致思考了一下,查阅了相关文档,大概就是下面这几点吧。
1.指令重排的问题,因为编译器和虚拟机的优化原因,会有指令重排的情况发生,但是我们加锁了,保证了程序的正确性和顺序。
2.为了硬件方面做兼容吧,毕竟缓存一致性协议是cpu内部定义的。
3.时效性。缓存一致性协议虽然能够使缓存信息更新,但是没有保证什么时候什么时候能够同步到主内存及其他cpu。(个人觉得主要原因)
大家有什么好的理解,欢迎分享一下哈。谢谢了。
边栏推荐
- 打印9*9乘法口诀表(C语言)
- September 21, 2020 referer string segmentation boost gateway code organization level
- 通过Win32API调用另一界面的按钮
- 1021 deep root (25 points)
- How to quickly complete disk partitioning
- Nacos environmental isolation
- Web vulnerability manual detection and analysis
- 软件测试模型(V模型和W模型)
- L2-3 is this a binary search tree- The explanation is wonderful
- 在实践中学习Spark计算框架(01)
猜你喜欢
随机推荐
To 3 -- the last programming challenge
Text of the basic component of the shutter
查看CSDN的博客排名
MySQL中update一条record的过程
Weight recursion of complete binary tree -- the last programming challenge
Common usage of LINQ in C #
在实践中学习Spark计算框架(01)
L2-031 go deep into the tiger's den (25 points)
520 diamond Championship 2021
DevExpress的双击获取单元格数据
1146 topological order (25 points)
Analysis on the specific execution process of an insert statement in MySQL 8.0 (3)
Win32Exception (0x80004005): 组策略阻止了这个程序。要获取详细信息,请与系统管理员联系。
MySQL中innodb_page_cleaners详解
MySQL innodb每行数据长度的限制
L2-3 is this a binary search tree- The explanation is wonderful
How can I get the stock account opening discount? Also, is it safe to open an account online?
std::unique_ptr<T>与boost::scoped_ptr<T>的特殊性
Dynamic planning summary
Rikka with cake (segment tree + segment tree)









