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状态”。
可见性问题的产生 CPU的高速缓存 缓存包含L1(L1d-数据缓存(存放数据)、L1i指令缓存(执行数据的指令码))、L2、L3,其中L3是CPU共享,而L1和L2是每个cpu独占的缓存空间。 运行速度方面:L1最快、L2次快、L3最慢;容量大小方面:L1最小、L2较大、L3最大。 缓存锁引入了缓存一致性协议来保证,有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,失效由于只有 4 种状态,可以只用 2 bit 进行编码。 性能优化MESI 协议的最大性能开销源于写入前的 RFO 操作,该操作负责获取独占式缓存(仅在命中 Shared 或 Invalid 时触发)。
CPU 缓存一致性协议 MESI ================ CPU 高速缓存(Cache Memory) ---------------------- CPU 为何要有高速缓存 CPU 在摩尔定律的指导下以每 多级缓存结构 [007S8ZIlgy1gj6nx5wl9rj30im0jgq4r.jpg] 多核 CPU 多级缓存一致性协议 MESI --------------------- 多核 CPU 的情况下有多个一级缓存 这里就引出了一个一致性的协议 MESI。 MESI 协议缓存状态 MESI 是指 4 中状态的首字母。 每个 Cache line 有 4 个状态,可用 2 个 bit 表示,它们分别是: 缓存行(Cache line): 缓存存储数据的单元。 [007S8ZIlgy1gj6nxzimg6j30o80o2gow.jpg] MESI 优化和他们引入的问题 --------------- 缓存的一致性消息传递是要时间的,这就使其切换时会产生延迟。
笔者在学习过程中发现了一个不错的网站,模拟了MESI协议流程,现分享下: https://www.scss.tcd.ie/Jeremy.Jones/vivio/caches/MESI.htm 运行效果图如下所示 PS: 1、本文讲述的是Write-Back(回写)的总线嗅探机制,这种机制在CPU架构中使用的比较多 2、需要注意的是上述情形对于一般的java变量是无效的,必须使用volatile获取synchronized 被volatile修饰的变量在执行时会有lock指令,该指令借助MESI协议保证数据写回到主内存,同时使得其他CPU核缓存的工作缓存变量失效,这样其他线程(不同CPU核心)再次操作该数据时,从缓存中取数据时发现该副本失效而重新从主内存加载该变量到工作内存中 参考文章: 1、http://gee.cs.oswego.edu/dl/jmm/cookbook.html 2、https://crowhawk.github.io/2018/02/10/volatile
缓存一致性——MESI协议 CPU多级缓存官方概念 CPU在摩尔定律的指导下以每18个月翻一番的速度在发展,然而内存和硬盘的发展速度远远不及CPU,所以才引入了缓存的概念。 解决方式二——MESI协议(重点) 针对上面缓存数据不一致的情况,提出了MESI协议用以保证多个CPU缓存中共享数据的一致性,定义了缓存行Cache Line四个状态,分表是M(Modified),E( 5.store存储:将a=2存储到主内存中。 6.write写入:将a=2写入到主内存的a变量中。 上面说的MESI协议是在总线那边实践的,线程A,B可以同时获取主内存a的值,a进行自增操作之后在进行操作6write写入的时候,会经过总线。 此篇是并发系列的基础,主要聊了硬件的MESI协议,原子的八种操作,线程和进程的关系,线程的一些基础操作,JMM的基础等。如果有什么错误,或者不对的地方,欢迎指正。
比如我在腾讯云买的最低配云主机…… MESI 并发场景下(比如多线程)如果操作相同变量,如何保证每个核中缓存的变量是正确的值,这涉及到一些”缓存一致性“的协议。 其中应用最广的就是MESI协议(当然这并不是唯一的缓存一致性协议)。 状态介绍 在缓存行的元信息中有一个Flag字段,它会表示4种状态,分为对应如下所说的M、E、S、I状态。 举例 假设CPU0、CPU1、CPU2、CPU3中有一个缓存行(包含变量x)都是S状态。 L3 Cache在MESI中的角色 L3 缓存是所有CPU共享的一个缓存。纵观刚才描述的MESI,好像涉及的都是CPU内的缓存更新,不涉及L3缓存,那么L3缓存在MESI中扮演什么角色呢? 个人猜测是如果描述MESI状态流转的时候引入L3缓存,会造成描述会极其复杂。所以一般的描述都好似有意地忽略了L3缓存。
多级缓存结构 多核CPU多级缓存一致性协议MESI 多核CPU的情况下有多个一级缓存,如何保证缓存内部数据的一致,不让系统数据混乱。这里就引出了一个一致性的协议MESI。 MESI协议缓存状态 MESI 是指4中状态的首字母。每个Cache line有4个状态,可用2个bit表示,它们分别是: 缓存行(Cache line):缓存存储数据的单元。 cache数据 远端读取(Remote read) 其他cache读取本地cache数据 远端写入(Remote write) 其他cache写入本地cache数据 2.cache分类: 前提:所有的 那么其他拥有x变量的cache 2、cache 3等x的cache line调整为S状态(共享)或者调整为 I 状态(无效)。 MESI优化和他们引入的问题 缓存的一致性消息传递是要时间的,这就使其切换时会产生延迟。
现在使用最普遍的是mesi协议, 三. mesi协议的工作原理 四个字母分别代表在缓存里不同的四个状态: M:已修改 E:独占 S:共享 I:已失效 MESI 是4种状态的首字母。 跨缓存行就不是原子的了, 不是原子的, 缓存一致性协议就搞不定了, 缓存一致性协议就升级为总线锁了 ,谁抢到谁赢. 问题2: 既然最终都可以总线锁解决问题, 为什么还要用总线裁决呢? --------------------------------------以下是课件内容---------------------------------------------- 1.1 MESI协议缓存状态 MESI 是4种状态的首字母。 1.2 MESI状态转换 ?
根据上文我们了解到cpu加载执行计算的流程: 1、程序和数据被加载到主内存中(Main Memory) 2、指令和数据被加载到CPU的高速缓存(L1、L2、L3) 3、CPU执行完指令,结果同步到高速缓存 (L1、L2、L3) 4、最后将高速缓存中的数据同步到主内存中(Main Memory) 所以在多CPU的情况下加载回主内存或缓存需要保持缓存一致性要么加锁,要么用于本文的MESI来实现。 缓存一致性协议-MESI是什么? MESI是Modify(修改)、Exclusive(独享、互斥)、Shared(共享)、Invalid(无效)首字母组成的。 所以上面的四种状态就是保存在缓存行中,每个状态需要2个Bit位去存储(就是Flag)。、 什么是缓存行伪共享? volatile long b; } MESI状态有哪些?
那么该文章就来用为简洁的话语来解释MESI协议。 2 为什么需要缓存一致性协议 在前面JMM内存模型文章中,我有写到多个线程并发访问一个主内存的共享变量时,这些线程会在各自的工作内存中拷贝一份共享变量的副本,那么这就带来了一个问题,一个线程对共享变量进行修改后 如下图,就是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 Step 2: As the block is already present in the cache and in an exclusive state so it directly modifies Step 7: There is cache miss on P2 and a BusRd is posted. 参考资料 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 和内存的速度差距太大,为了拉平两者的速度差,现代计算机会在两者之间插入一块速度比内存更快的高速缓存,CPU 缓存是分级的,有 L1 / L2 / L3 三级缓存 在 CPU Cache 的三级缓存中,会存在 2 个缓存一致性问题: 纵向 - Cache 与内存的一致性问题:通过写直达或写回策略解决; 横向 - 多核心 Cache 的一致性问题:通过 MESI 等缓存一致性协议解决 MESI 协议能够满足写传播和事务串行化 2 点特性,通过 “已修改、独占、共享、已失效” 4 个状态实现了 CPU Cache 的一致性; 现代 CPU 为了提高并行度,会在增加写缓冲区 & 失效队列将 MESI 协议的请求异步化,这其实是一种处理器级别的指令重排,会破坏了 CPU Cache 的一致性。
前言:今天,我们就深入聊聊关于CPU缓存一致性协议MESI的有关知识,希望能够为小伙伴们带来实质性的帮助。 多级缓存结构 多核CPU多级缓存一致性协议MESI 多核CPU的情况下有多个一级缓存,如何保证缓存内部数据的一致,不让系统数据混乱。这里就引出了一个一致性的协议MESI。 MESI协议缓存状态 MESI 是指4中状态的首字母。每个Cache line有4个状态,可用2个bit表示,它们分别是: 缓存行(Cache line):缓存存储数据的单元。 MESI状态转换 理解该图的前置说明: 1.触发事件 2.cache分类:前提:所有的cache共同缓存了主内存中的某一条数据。 本地cache:指当前cpu的cache。 那么其他拥有x变量的cache 2、cache 3等x的cache line调整为S状态(共享)或者调整为 I 状态(无效)。
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协议进行讲述。 四种缓存状态缓存行有4个状态,用2个bit表示。 MESI 缓存一致性协议中为了尽可能的提高性能,引入了 Store Bufferes & Invalidate Queue ,将数据具体的失效时机和写入时间交给了内存屏障控制,而 JMM 则基于内存屏障保证数据的可见性
前言 本文是蓝牙协议分析的第二篇文章,在“蓝牙协议分析(1)_基本概念”的基础上,从整体架构的角度,了解蓝牙协议的组成,以便加深对蓝牙的理解。 2. 蓝牙协议分为四个层次:物理层(Physical Layer)、逻辑层(Logical Layer)、L2CAP Layer和应用层(APP Layer)。 L2CAP层,L2CAP是逻辑链路控制和适配协议(Logical Link Control and Adaptation Protocol)的缩写,负责管理逻辑层提供的逻辑链路。 基于该协议,不同Application可共享同一个逻辑链路。类似TCP/IP中端口(port)的概念。 APP层,理解蓝牙协议中的应用层,基于L2CAP提供的channel,实现各种各样的应用功能。 2.3 L2CAP Channels L2CAP是Logical Link Control and Adaptation Protocol(逻辑链路控制和适配协议)的缩写,蓝牙协议到这个层次的时候,就清爽多了
多级缓存结构 多核CPU多级缓存一致性协议MESI 多核CPU的情况下有多个一级缓存,如何保证缓存内部数据的一致,不让系统数据混乱。这里就引出了一个一致性的协议MESI。 MESI协议缓存状态 MESI 是指4中状态的首字母。每个Cache line有4个状态,可用2个bit表示,它们分别是: 缓存行(Cache line):缓存存储数据的单元。 MESI状态转换 理解该图的前置说明: 1.触发事件 2.cache分类: 前提:所有的cache共同缓存了主内存中的某一条数据。 本地cache:指当前cpu的cache。 那么其他拥有x变量的cache 2、cache 3等x的cache line调整为S状态(共享)或者调整为 I 状态(无效)。 MESI优化和他们引入的问题 缓存的一致性消息传递是要时间的,这就使其切换时会产生延迟。