全面理解MESI缓存一致性协议

目录

MESI缓存一致性协议

多核CPU多级缓存一致性协议MESI

MESI协议缓存状态

MESI优化和他们引入的问题


MESI缓存一致性协议

 

多核CPU多级缓存一致性协议MESI

多核CPU的情况下有多个一级缓存,如何保证缓存内部数据的一致,不让系统数据混乱。这里就引出了一个一致性的协议MESI

 

MESI协议缓存状态

MESI 是指4中状态的首字母。每个Cache line(缓存行(Cache line:缓存存储数据的单元)。4个状态,可用2bit表示,它们分别是:Modidied(修改),Exclusive(独享),Shared(共享),Invalid(无效)。

注意:

对于ME状态而言总是精确的,他们在和该缓存行的真正状态是一致的,而S状态可能是非一致的。如果一个缓存将处于S状态的缓存行作废了,而另一个缓存实际上可能已经独享了该缓存行,但是该缓存却不会将该缓存行升迁为E状态,这是因为其它缓存不会广播他们作废掉该缓存行的通知,同样由于缓存并没有保存该缓存行的copy的数量,因此(即使有这种通知)也没有办法确定自己是否已经独享了该缓存行。

从上面的意义看来E状态是一种投机性的优化:如果一个CPU想修改一个处于S状态的缓存行,总线事务需要将所有该缓存行的copy变成invalid状态,而修改E状态的缓存不需要使用总线事务。

缓存行Cache line是有64byte,如果数据缓存行放不下,就得切换成总线锁。

总线锁:有参数变化,就得通过BUS总线。比如CPU ACPU 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。(个人觉得主要原因)

大家有什么好的理解,欢迎分享一下哈。谢谢了。

 

 

 

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值