MESI 协议 基于写失效(Write Invalidate) 如果某个 CPU 核心 写入一个 Cache Line,则会广播一个失效请求告诉所有其他的 CPU 核心。 参考:https://zh.wikipedia.org/wiki/MESI协议 by 斯武丶风晴 https://my.oschina.net/langxSpirit
这就需要用到缓存一致性协议。 缓存一致性协议的基础版本为MSI协议,也叫作写入失效协议。如果同时有多个CPU要写入,总线会进行串行化,同一时刻只会有一个CPU获得总线的访问权。 MESI协议 缓存行的相容关系 目前主流的缓存一致性协议为MESI写入失效协议,而MESI是MSI协议的扩展。 在MESI协议中,每个缓存行(Cache Line)有4种状态,即M、E、S和I(全名是Modified、Exclusive、Shared和Invalid) 1.M:被修改(Modified) 该缓存行的数据只在本 4.I:无效的(Invalid) 该缓存行是无效的,可能有其他CPU修改了该缓存行。 MESI状态转换 (1)初始阶段:开始时,缓存行没有加载任何数据,所以它处于“I状态”。 (4)远程读(Remote Read)阶段:假设我们有两个CPU c1和c2,如果c2需要读c1的缓存行内容,c1需要把它的缓存行内容通过主存控制器(Memory Controller)发送给c2,c2
缓存锁引入了缓存一致性协议来保证,有MSI,MESI.MOSI等等! CPU为何要有高速缓存 CPU中内置了少量的高速缓存以解决I\O速度和CPU运算速度之间的不匹配问题。 带有高速缓存的CPU执行计算的流程: 程序以及数据被加载到主内存 指令和数据被加载到CPU的高速缓存 CPU执行指令,把结果写到高速缓存 高速缓存中的数据写回主内存 CPU缓存一致性协议MESI MESI 是指4中状态的首字母。 每个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 在摩尔定律的指导下以每 执行计算的流程 程序以及数据被加载到主内存 指令和数据被加载到 CPU 的高速缓存 CPU 执行指令,把结果写到高速缓存 高速缓存中的数据写回主内存 [007S8ZIlgy1gj6nx2s1i9j30iq0a4gmg.jpg 多级缓存结构 [007S8ZIlgy1gj6nx5wl9rj30im0jgq4r.jpg] 多核 CPU 多级缓存一致性协议 MESI --------------------- 多核 CPU 的情况下有多个一级缓存 这里就引出了一个一致性的协议 MESI。 MESI 协议缓存状态 MESI 是指 4 中状态的首字母。 每个 Cache line 有 4 个状态,可用 2 个 bit 表示,它们分别是: 缓存行(Cache line): 缓存存储数据的单元。
笔者在学习过程中发现了一个不错的网站,模拟了MESI协议流程,现分享下: https://www.scss.tcd.ie/Jeremy.Jones/vivio/caches/MESI.htm 运行效果图如下所示 被volatile修饰的变量在执行时会有lock指令,该指令借助MESI协议保证数据写回到主内存,同时使得其他CPU核缓存的工作缓存变量失效,这样其他线程(不同CPU核心)再次操作该数据时,从缓存中取数据时发现该副本失效而重新从主内存加载该变量到工作内存中 2018/02/10/volatile/ 3、https://betsol.com/2017/06/java-memory-management-for-java-virtual-machine-jvm/ 4、
缓存一致性——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架构 缓存与主存 解读缓存一致性(Cache Coherency),先看一下CPU的架构 图示一个4核CPU,有三个级别的缓存,分为是L1 Cache(一级缓存)、L2 Cache(二级缓存)、 比如我在腾讯云买的最低配云主机…… MESI 并发场景下(比如多线程)如果操作相同变量,如何保证每个核中缓存的变量是正确的值,这涉及到一些”缓存一致性“的协议。 其中应用最广的就是MESI协议(当然这并不是唯一的缓存一致性协议)。 状态介绍 在缓存行的元信息中有一个Flag字段,它会表示4种状态,分为对应如下所说的M、E、S、I状态。 (对应4种操作,只会流转到一个状态) 而想从其他状态流转到达E状态,比较刁钻。 L3 Cache在MESI中的角色 L3 缓存是所有CPU共享的一个缓存。纵观刚才描述的MESI,好像涉及的都是CPU内的缓存更新,不涉及L3缓存,那么L3缓存在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协议的工作原理 四个字母分别代表在缓存里不同的四个状态: M:已修改 E:独占 S:共享 I:已失效 MESI 是4种状态的首字母。 --------------------------------------以下是课件内容---------------------------------------------- 1.1 MESI协议缓存状态 MESI 是4种状态的首字母。 1.2 MESI状态转换 ?
加载执行计算的流程: 1、程序和数据被加载到主内存中(Main Memory) 2、指令和数据被加载到CPU的高速缓存(L1、L2、L3) 3、CPU执行完指令,结果同步到高速缓存(L1、L2、L3) 4、 缓存一致性协议-MESI是什么? MESI是Modify(修改)、Exclusive(独享、互斥)、Shared(共享)、Invalid(无效)首字母组成的。 volatile long b; } MESI状态有哪些? 以上是触发的MESI状态图,分别为本地读取、本地写入、远端读取、远端写入,如下表描述。 vd_source=7d0e42b081e08cb3cefaea55cc1fa8b7 https://www.bilibili.com/video/BV1pC4y1W7zS/?
那么该文章就来用为简洁的话语来解释MESI协议。 Exclusive(独占的,记为E)缓存行独占相应内存地址数据的副本,其他处理器高速缓存不包含相同的副本或者副本失效,缓存行中的数据与主内存数据一致 4. 如下图,就是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 4: Here a BusUpgr is posted on the bus and the snooper on P1 senses this and invalidates the block 参考资料 https://en.wikipedia.org/wiki/MESI_protocol Biased Locking in HotSpot [并发大神的博客] https://blogs.oracle.com
MESI一致性协议 小陈:老王,上一章你让我看看MESI一致性协议,我大概了解了一下。 老王:哦,来说说你对MESI一致性协议的理解 小陈:MESI协议也叫做缓存一致性协议,主要是用来进行协调多核CPU的高级缓存的数据一致的。 小陈:那是,问了看懂这个MESI协议,我可是连续肝了两天晚上,点了无数根华子... 老王:孺子可教也,那你继续来说说MESI的缓存一致性的内容 小陈:MESI一致性协议定义了高速缓存中数据的4中状态,分别是: M(Modified): 修改过的,只有一个CPU能独占这个修改状态,独占的意思是当有一个 4.什么是MESI缓存一致性协议?怎么解决并发的可见性问题? JAVA并发专题《练气篇》 5.volatile怎么保证可见性? 6.什么是内存屏障?具有什么作用?
所有的数据存储都是通过cache进行,比如读一个地址的数据:如果L1cache未命中,则读取L2cache,如果L2未命中则读取L3,如果L3未命中,则读取物理内存,读取时间会越来越慢,L1访问速度大概2-4个时钟周期 读写cache需要cache一致性协议保证数据正确,MESI协议规定了一块内存的五种状态:Modified(M,修改),Exclusive(E,独占),Share(S,共享),Invalid(I,无效) 在MESI协议下,读取内存块如果其它cpu都是I状态,则当前cpu该块会变成E状态,然后写入的时候直接写就可以,不需要发送使该块失效的信号。 MESI协议和MSI协议最大不同就是其他状态到S or E状态,还有E到M状态,其他和MSI协议没啥区别。 MESI协议在多核cpu下保证了cache数据的一致性,使每个cpu在读取数据时都是读到的最新的数据,也遵守了SWMR(单写多读)策略,写的时候只能有一个cpu被总线仲裁成功。
我们也讨论了 MESI 协议通过写传播和事务串行化实现缓存一致性。 MESI 协议能够满足写传播和事务串行化 2 点特性,通过 “已修改、独占、共享、已失效” 4 个状态实现了 CPU Cache 的一致性; 现代 CPU 为了提高并行度,会在增加写缓冲区 & 失效队列将 MESI 协议的请求异步化,这其实是一种处理器级别的指令重排,会破坏了 CPU Cache 的一致性。 :既然 CPU 已经实现了 MESI 协议,为什么 Java 语言层面还需要定义 volatile 关键字呢? ---- 4. 回答最初的问题 到这里,虽然我们的讨论还未结束,但已经足够回答标题的问题:“已经有 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协议进行讲述。 四种缓存状态缓存行有4个状态,用2个bit表示。 MESI 缓存一致性协议中为了尽可能的提高性能,引入了 Store Bufferes & Invalidate Queue ,将数据具体的失效时机和写入时间交给了内存屏障控制,而 JMM 则基于内存屏障保证数据的可见性
IP地址(IPv4) 这里所说的IP地址是IPv4地址,IP地址由32位正整数来表示。他在计算机内部被以二进制方式处理,因此最多有2^32个IP地址,即:43亿个总IPv4地址。 IPv4数据报格式 ? 版本号:在IPv4数据报中,版本号就是4。不同的IP版本使用的数据报格式不同,IPv6的数据报不是这样的。 协议:该字段指示传输层所使用的协议类型。通过该字段指示了IP数据报应该交给哪个传输层协议。典型的有值为6的时候,表示应该交由TCP协议,值为17的时候,表示交由UDP协议。 在上层协议是UDP协议的情形下,首先在发送端主机发送IP包的时候设置分片禁止标志。途中的路由器即使遇到了包的大小超过了数据链路的MTU,也不去分片,直接将包丢弃。 在上层协议是TCP协议的情形下。由于TCP协议是面向有连接的(两台主机之间要维护这个连接)。TCP协议会根据路径MTU的大小来计算出最大段长度MSS。