美文网首页学习空间
缓存一致性协议

缓存一致性协议

作者: Zeppelin421 | 来源:发表于2022-06-23 09:57 被阅读0次

锁缓存行有一套协议叫做缓存一致性协议。缓存一致性协议有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


单核读取

  • CPU-A发出一条指令,从主内存中读取x
  • 从主内存通过bus读取到缓存中,此时该Cache Line修改为E状态

多核读取
  • CPU-A发出了一条指令,从主内存中读取x
  • CPU-A从主内存通过bus读取到cache-a中并将该Cache Line设置为E状态
  • CPU-B发出一条指令,从主内存中读取x
  • CPU-B试图从主内存中读取x时,CPU-A检测到了地址冲突。这时CPU-A对相应数据做出响应。此时x存在于cache-a和cache-b中,x在cache-a和cache-b中都被设置为S状态

    修改数据
  • CPU-A计算完成后发指令需要修改x
  • CPU-A将x设置为M状态(修改)并通知缓存了x的CPU-B,CPU-B将本地cache-b中的x设置为I状态(无效)
  • CPU-A对x进行赋值

同步数据
  • CPU-B发出了要读取x的指令
  • CPU-B通知CPU-A,CPU-A将修改后的数据同步到主内存时cache-a修改为E状态(独享)
  • CPU-A同步CPU-B的x,将cache-a和同步后cache-b中的x设置为S状态(共享)

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

相关文章

  • JVM-003-MESI

    MESI 一、缓存一致性协议   缓存一致性协议有很多,不同的厂商使用的缓存一致性协议是不同的,其中intel使用...

  • 缓存一致性协议

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

  • 内存模型和原子操作笔记

    1. 缓存一致性协议 缓存一致性协议MESI可以保证,在所有的脏缓存段被回写后,任意缓存级别的所有缓存段中的内容,...

  • Java JMM 缓存一致性 Volatile

    缓存一致性问题及协议 如果A操作改a,B操作也改a,那么需要遵守缓存一致性协议来更新内存。 编译器重排序 编译器会...

  • 88,分布式数据同步一致性方案-mysql与缓存双写一致

    1 缓存一致性协议产生的背景 2,多级缓存框架设计方案 3,Mysql与redis缓存一致性原理mysql 与re...

  • 聊聊高并发(六)实现几种自旋锁(一)

    在聊聊高并发(五)理解缓存一致性协议以及对并发编程的影响 我们了解了处理器缓存一致性协议的原理,并且提到了它对并发...

  • java多线程-3-volatile

    缓存一致性问题 起因:高速缓存 方案总线LOCK#锁,释放锁前该块内存无法被别的cpu或线程访问缓存一致性协议(I...

  • Java多线程21 JMM与Lock

    II. 缓存一致性MESI协议中的缓存状态 状态含义监听任务M 被修改Modified因为缓存行刚被修改,数据应是...

  • Java多线程系列(一)--硬件基础

    本文主要介绍与多线程编程紧密相关的硬件基础知识。内容涉及: 高速缓存 缓存一致性协议--MESI协议 写缓冲器和无...

  • 并发编程之漫谈伪共享

    文章目录 CPU缓存 CPU缓存一致性协议2.1 局部性原理2.2 Cache Line2.3 cache的写方式...

网友评论

    本文标题:缓存一致性协议

    本文链接:https://www.haomeiwen.com/subject/etbpvrtx.html