MESI 协议 基于写失效(Write Invalidate) 如果某个 CPU 核心 写入一个 Cache Line,则会广播一个失效请求告诉所有其他的 CPU 核心。 参考:https://zh.wikipedia.org/wiki/MESI协议 by 斯武丶风晴 https://my.oschina.net/langxSpirit
MSI协议 多核CPU都有自己的专有高速缓存(一般为L1、L2),以及同一个CPU芯片板上不同CPU内核之间共享的高速缓存(一般为L3)。 这就需要用到缓存一致性协议。 缓存一致性协议的基础版本为MSI协议,也叫作写入失效协议。如果同时有多个CPU要写入,总线会进行串行化,同一时刻只会有一个CPU获得总线的访问权。 MESI协议 缓存行的相容关系 目前主流的缓存一致性协议为MESI写入失效协议,而MESI是MSI协议的扩展。 在MESI协议中,每个缓存行(Cache Line)有4种状态,即M、E、S和I(全名是Modified、Exclusive、Shared和Invalid) 1.M:被修改(Modified) 该缓存行的数据只在本 MESI状态转换 (1)初始阶段:开始时,缓存行没有加载任何数据,所以它处于“I状态”。
缓存锁引入了缓存一致性协议来保证,有MSI,MESI.MOSI等等! CPU为何要有高速缓存 CPU中内置了少量的高速缓存以解决I\O速度和CPU运算速度之间的不匹配问题。 带有高速缓存的CPU执行计算的流程: 程序以及数据被加载到主内存 指令和数据被加载到CPU的高速缓存 CPU执行指令,把结果写到高速缓存 高速缓存中的数据写回主内存 CPU缓存一致性协议MESI MESI 每个Cache line有4个状态,它们分别是: 协议动态演示地址 超级好用 链接: MESI动态地址 具体的细节动态图里有详细体现,比我在这哔哔哔半天有用的多 总结Volatile作用 1
解决办法:MESI 缓存一致性协议。核心思想:通过降低锁的粒度,减少使用总线锁的频率,从而达到性能优化。2. 原理MESI 协议维护一个有限状态机,对每个 CPU 拷贝的每个缓存行都赋予一个状态属性;当感知到对某个缓存行的读写事件发生时,根据该缓存行的状态,对其进行一致性处理。 缓存行状态MESI 协议对每个缓存行赋予一个状态属性,MESI 协议就是由这四种状态的首字母来命名的:M:Modified,修改E:Exclusive,独占S:Shared,共享I:Invalid,失效由于只有 性能优化MESI 协议的最大性能开销源于写入前的 RFO 操作,该操作负责获取独占式缓存(仅在命中 Shared 或 Invalid 时触发)。 衍生协议MOESI 协议若多个 CPU 对相同的数据连续写入,每次读写都会将数据发布到总线上,以维持最新的缓存。MOESI 协议增加了一个 Own 状态,该状态是脏的且共享的。
笔者在学习过程中发现了一个不错的网站,模拟了MESI协议流程,现分享下: https://www.scss.tcd.ie/Jeremy.Jones/vivio/caches/MESI.htm 运行效果图如下所示 被volatile修饰的变量在执行时会有lock指令,该指令借助MESI协议保证数据写回到主内存,同时使得其他CPU核缓存的工作缓存变量失效,这样其他线程(不同CPU核心)再次操作该数据时,从缓存中取数据时发现该副本失效而重新从主内存加载该变量到工作内存中
缓存一致性——MESI协议 CPU多级缓存官方概念 CPU在摩尔定律的指导下以每18个月翻一番的速度在发展,然而内存和硬盘的发展速度远远不及CPU,所以才引入了缓存的概念。 解决方式二——MESI协议(重点) 针对上面缓存数据不一致的情况,提出了MESI协议用以保证多个CPU缓存中共享数据的一致性,定义了缓存行Cache Line四个状态,分表是M(Modified),E( 上面说的MESI协议是在总线那边实践的,线程A,B可以同时获取主内存a的值,a进行自增操作之后在进行操作6write写入的时候,会经过总线。 线程B一直使用嗅探监控总线中自己感兴趣的变量a,一旦发现a值有修改,立刻将自己工作内存中a置为无效Invalid(利用MESI协议),并立刻从主内存中读取a值,这个时候总线中a还没有写入内存,所以有个短暂的 此篇是并发系列的基础,主要聊了硬件的MESI协议,原子的八种操作,线程和进程的关系,线程的一些基础操作,JMM的基础等。如果有什么错误,或者不对的地方,欢迎指正。
CPU 缓存一致性协议 MESI ================ CPU 高速缓存(Cache Memory) ---------------------- CPU 为何要有高速缓存 CPU 在摩尔定律的指导下以每 多级缓存结构 [007S8ZIlgy1gj6nx5wl9rj30im0jgq4r.jpg] 多核 CPU 多级缓存一致性协议 MESI --------------------- 多核 CPU 的情况下有多个一级缓存 这里就引出了一个一致性的协议 MESI。 MESI 协议缓存状态 MESI 是指 4 中状态的首字母。 [007S8ZIlgy1gj6nxzimg6j30o80o2gow.jpg] MESI 优化和他们引入的问题 --------------- 缓存的一致性消息传递是要时间的,这就使其切换时会产生延迟。
多级缓存结构 多核CPU多级缓存一致性协议MESI 多核CPU的情况下有多个一级缓存,如何保证缓存内部数据的一致,不让系统数据混乱。这里就引出了一个一致性的协议MESI。 MESI协议缓存状态 MESI 是指4中状态的首字母。每个Cache line有4个状态,可用2个bit表示,它们分别是: 缓存行(Cache line):缓存存储数据的单元。 MESI状态转换 理解该图的前置说明: 1.触发事件 触发事件 描述 本地读取(Local read) 本地cache读取本地cache数据 本地写入(Local write) 本地cache写入本地 MESI优化和他们引入的问题 缓存的一致性消息传递是要时间的,这就使其切换时会产生延迟。
比如我在腾讯云买的最低配云主机…… MESI 并发场景下(比如多线程)如果操作相同变量,如何保证每个核中缓存的变量是正确的值,这涉及到一些”缓存一致性“的协议。 其中应用最广的就是MESI协议(当然这并不是唯一的缓存一致性协议)。 状态介绍 在缓存行的元信息中有一个Flag字段,它会表示4种状态,分为对应如下所说的M、E、S、I状态。 L3 Cache在MESI中的角色 L3 缓存是所有CPU共享的一个缓存。纵观刚才描述的MESI,好像涉及的都是CPU内的缓存更新,不涉及L3缓存,那么L3缓存在MESI中扮演什么角色呢? 其实在常见的MESI的状态流程描述中(我上文也是),所有提到”内存“的地方都是值得商榷的。比如我上一节举的例子中,CPU0中某缓存行是I,CPU1 中是M。 个人猜测是如果描述MESI状态流转的时候引入L3缓存,会造成描述会极其复杂。所以一般的描述都好似有意地忽略了L3缓存。
因此发展出来了缓存一致性协议. 现在使用最普遍的是mesi协议, 三. mesi协议的工作原理 四个字母分别代表在缓存里不同的四个状态: M:已修改 E:独占 S:共享 I:已失效 MESI 是4种状态的首字母。 --------------------------------------以下是课件内容---------------------------------------------- 1.1 MESI协议缓存状态 MESI 是4种状态的首字母。 1.2 MESI状态转换 ?
执行完指令,结果同步到高速缓存(L1、L2、L3) 4、最后将高速缓存中的数据同步到主内存中(Main Memory) 所以在多CPU的情况下加载回主内存或缓存需要保持缓存一致性要么加锁,要么用于本文的MESI 缓存一致性协议-MESI是什么? MESI是Modify(修改)、Exclusive(独享、互斥)、Shared(共享)、Invalid(无效)首字母组成的。 类型是8字节) class Test { volatile long a; long p1, p2, p3, p4, p5, p6, p7; volatile long b; } MESI 以上是触发的MESI状态图,分别为本地读取、本地写入、远端读取、远端写入,如下表描述。 参考资料: https://baike.baidu.com/item/MESI%E5%8D%8F%E8%AE%AE/22742331 https://note.youdao.com/ynoteshare
那么该文章就来用为简洁的话语来解释MESI协议。 为了保持数据的一致性,MESI将缓存条目的状态划分为Modified.Exclusive,Shared,Invalid MESI协议中一个缓存条目的状态Flag值分为以下四种 1. 如下图,就是MESI的概要图。 ? 通过上面的理论,还不好解释MESI协议在CPU多核中到底是如何运用的,我会在下面通过几张图片的案例,来详细剖析它协议的转换过程。 以上是针对正常的情况,MESI协议能够正常的对缓存行进行状态标识转换,那么我们来聊一聊针对非正常情况,MESI协议是否还适用呢? 协议无法同时对线程内的两个缓存行进行lock加锁,这时MESI协议失效,缓存行锁失效,从而晋升到bus总线锁。
本节对应的中文视频教程请关注公众号 fencai-edu MESI是缓存一致性协议,分别代表四种不同的状态。 Invalid (I) Indicates that this cache line is invalid (unused). ---- 一下描述的3个CPU情况下,缓存一致性协议的工作流程 image.png 参考资料 https://en.wikipedia.org/wiki/MESI_protocol Biased Locking in HotSpot [并发大神的博客] https://blogs.oracle.com
读写cache需要cache一致性协议保证数据正确,MESI协议规定了一块内存的五种状态:Modified(M,修改),Exclusive(E,独占),Share(S,共享),Invalid(I,无效) 在MESI协议下,读取内存块如果其它cpu都是I状态,则当前cpu该块会变成E状态,然后写入的时候直接写就可以,不需要发送使该块失效的信号。 所以MESI协议首先要解决,如何确定没有其它共享者,而让本块变为E状态,比如可以添加一根共享信号线做或运算,每个cpu在读取内存修改状态时都要判断共享信号线,如果共享信号线为1,则将cache块状态置为 MESI协议和MSI协议最大不同就是其他状态到S or E状态,还有E到M状态,其他和MSI协议没啥区别。 MESI协议在多核cpu下保证了cache数据的一致性,使每个cpu在读取数据时都是读到的最新的数据,也遵守了SWMR(单写多读)策略,写的时候只能有一个cpu被总线仲裁成功。
我们也讨论了 MESI 协议通过写传播和事务串行化实现缓存一致性。 MESI 协议的请求异步化,这其实是一种处理器级别的指令重排,会破坏了 CPU Cache 的一致性。 Cache 不一致问题 MESI 协议在线模拟 网站地址:https://www.scss.tcd.ie/Jeremy.Jones/VivioJS/caches/MESI.htm 现在,我们的问题是 :既然 CPU 已经实现了 MESI 协议,为什么 Java 语言层面还需要定义 volatile 关键字呢? 回答最初的问题 到这里,虽然我们的讨论还未结束,但已经足够回答标题的问题:“已经有 MESI 协议,为什么还需要 volatile 关键字?”
前言:今天,我们就深入聊聊关于CPU缓存一致性协议MESI的有关知识,希望能够为小伙伴们带来实质性的帮助。 学习直通车: Linux内核源码/内存调优/文件系统/进程管理/设备驱动/网络协议栈 内核资料直通车: Linux内核源码技术学习路线+视频教程代码资料 带有高速缓存的CPU执行计算的流程 程序以及数据被加载到主内存 多级缓存结构 多核CPU多级缓存一致性协议MESI 多核CPU的情况下有多个一级缓存,如何保证缓存内部数据的一致,不让系统数据混乱。这里就引出了一个一致性的协议MESI。 MESI协议缓存状态 MESI 是指4中状态的首字母。每个Cache line有4个状态,可用2个bit表示,它们分别是: 缓存行(Cache line):缓存存储数据的单元。 MESI优化和他们引入的问题 缓存的一致性消息传递是要时间的,这就使其切换时会产生延迟。
CAS指令与MESI缓存一致性协议、 “轻量级锁” 与原子操作 “最轻量级的锁”,通常也叫”原子操作”,之所以加引号是因为他们在汇编级别并不是原子操作,是用多条指令完成的,这些操作大多都是利用CPU 参考: Intel文档 http://faydoc.tripod.com/cpu/cmpxchg.htm MESI 缓存一致性协议 关于CAS指令最著名的传闻是CAS需要锁总线,因此CAS指令不但慢而且会严重影响系统并发度 目前的CPU一般都采用了很好的缓存一致性协议,在很多情况下能够防止锁总线的发生,这其中最著名的就是Intel CPU中使用的MESI缓存一致性协议。 先来说说缓存一致性问题。 但这 Stupid 的实现显然不会有好的性能,为解决这一问题,产生了很多维护缓存一致性的协议,MESI就是其中一种。 MESI协议的名称由来是指这一协议为缓存的每个数据单位(称为cache line,在Intel CPU上一般是64字节)维护两个状态位,使得每个数据单位可能处于M、E、S或I这四种状态之一。
CPU 多级缓存 & 缓存一致性协议(MESI)CPU 多级缓存参考:Java Memory Model缓存一致性协议(MESI)多级缓存的出现解决了CPU处理速度和内存读取速度不一致的问题,但是同时也带来缓存不一致的问题 ,为了解决这个问题,我们引入了缓存一致性协议,常见的缓存一致性协议有MSI,MESI,MOSI,Synapse,Firefly及DragonProtocol等等,下文以MESI协议进行讲述。 MESI 缓存一致性协议中为了尽可能的提高性能,引入了 Store Bufferes & Invalidate Queue ,将数据具体的失效时机和写入时间交给了内存屏障控制,而 JMM 则基于内存屏障保证数据的可见性
多级缓存结构 多核CPU多级缓存一致性协议MESI 多核CPU的情况下有多个一级缓存,如何保证缓存内部数据的一致,不让系统数据混乱。这里就引出了一个一致性的协议MESI。 MESI协议缓存状态 MESI 是指4中状态的首字母。每个Cache line有4个状态,可用2个bit表示,它们分别是: 缓存行(Cache line):缓存存储数据的单元。 MESI状态转换 理解该图的前置说明: 1.触发事件 2.cache分类: 前提:所有的cache共同缓存了主内存中的某一条数据。 本地cache:指当前cpu的cache。 MESI优化和他们引入的问题 缓存的一致性消息传递是要时间的,这就使其切换时会产生延迟。
CPU 3 在寄存器中修改 A 中内容,并且写入写缓存区StoreBuffer,假设修改是 ++A(就是A现在等于 A +1,图里放不下,简写成++A)