首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

深入解析 volatile 、CAS 的实现原理

MESI协议 我们知道,缓存系统操作的最小单位就是缓存行,而MESI缓存行四种状态的首字母缩写,任何多核系统中的缓存行都处于这四种状态之一。...前面我们已经介绍了原子操作的概念,所以这里CAS涉及的两步:a) 只有field的值为expect时;b) field的值修改为update的值;视为一个原子操作。...② 使用缓存锁保证原子同一时刻我们只需保证对某个内存地址的操作原子性即可,但总线锁定把CPU和内存之间通信锁住了,这使得锁定期间,其他处理器不能操作其他内存地址的数据,所以总线锁定的开销比较大...所谓“缓存锁定”就是如果缓存在处理器缓存行中内存区域LOCK操作期间被锁定,当它执行锁操作回写内存时,处理器不在总线上声言LOCK#信号,而是修改内部的内存地址,并允许它的缓存一致性机制来保证操作原子性...① 处理器上有一套完整的协议,来保证Cache一致性。比较经典的Cache一致性协议当属MESI协议。也就是说,MESI协议是处理器自身会遵循的一个缓冲一致性协议

2.3K11

4.什么是MESI缓存一致性协议?怎么解决并发的可见性问题?

老王:哦,来说说你对MESI一致性协议的理解 小陈:MESI协议也叫做缓存一致性协议,主要是用来进行协调多核CPU的高级缓存的数据一致的。...老王:孺子可教也,那你继续来说说MESI缓存一致性的内容 小陈:MESI一致性协议定义了高速缓存中数据的4中状态,分别是: M(Modified): 修改过的,只有一个CPU能独占这个修改状态,独占的意思是当有一个...CPU0执行 i++ 操作 i = 1 的最新结果刷入到高速缓存中,同时高速缓存的数据状态设为M(修改过的) 然后高速缓存中 i = 1 的最新结果又刷入主内存中 (4)CPU1要读取数据操作...小陈:是的 老王:那JAVA内存模型对应到底层肯定也是操作主内存、操作高速缓存操作数据的,既然多核CPU的缓存一致性又是通过MESI协议来达到一致性的。...目录 JAVA并发专题 《筑基篇》 1.什么是CPU多级缓存模型? 2.什么是JAVA内存模型? 3.线程安全之可见性、有序性、原子是什么? 4.什么是MESI缓存一致性协议

29530
您找到你想要的搜索结果了吗?
是的
没有找到

CAS指令与MESI缓存一致性协议、 “轻量级锁” 与原子操作CAS指令与MESI缓存一致性协议、 “轻量级锁” 与原子操作

CAS指令与MESI缓存一致性协议、 “轻量级锁” 与原子操作 “最轻量级的锁”,通常也叫”原子操作”,之所以加引号是因为他们汇编级别并不是原子操作,是用多条指令完成的,这些操作大多都是利用CPU...最常见的原子操作有Compare and Exchange,Self Increase/Decrease等等 80486 CPU相关指令: LOCK:这是一个指令前缀,在所对应的指令操作期间使此指令的目标操作数指定的存储区域锁定...目前的CPU一般都采用了很好的缓存一致性协议很多情况下能够防止锁总线的发生,这其中最著名的就是Intel CPU中使用的MESI缓存一致性协议。 先来说说缓存一致性问题。...MESI协议的名称由来是指这一协议缓存的每个数据单位(称为cache line,Intel CPU上一般是64字节)维护两个状态位,使得每个数据单位可能处于M、E、S或I这四种状态之一。...处于这一状态的数据只本CPU中有缓存,且其数据已被修改,没有更新到内存中 E: 独占的。处于这一状态的数据只本CPU中有缓存,且其数据没有被修改,与内存一致 S: 共享的。

2.6K61

深入理解JMM-CPU多核硬件架构剖析及Java内存模型

这个特性确保了单个总线事务之中的内存读/写操作具有原子性 处理器提供总线锁定和缓存锁定两个机制来保证复杂内存操作原子性 总线锁定 总线锁定就是使用处理器提供的一个 LOCK#信号,当其中一个处理器总线上输出此信号时...在读写时要根据协议来进行操作,这类协议有MSI、MESI、MOSI、Synapse、Firefly及DragonProtocol等等,但是用的最多的就是MESI。...缓存一致性协议会锁缓存行,其性能要比锁总线要高得多 MESI协议 M 修改 (Modified) 这行数据有效,数据被修改了,和主内存中的数据不一致,数据只存在于本Cache中。...lock(锁定):主内存变量加锁,标识位线程独占状态 unlock(解锁):主内存变量解锁,解锁后其他线程可以锁定该变量 [数据同步八大原子操作.png] [数据同步八大原子操作2.png] 并发三大特性...通过Lock保证有序性 原子原子性指的是一个操作是不可中断的,即使是多线程环境下,一个操作一旦开始就不会 被其他线程影响 如何保证原子性 通过 synchronized 关键字保证原子性 通过

62670

Java Concurrent CAS使用&原理

当且仅当预期值A和内存值V相同时,内存值V修改为B,否则什么都不做,因为基于底层的cmpchg原语,所以该操作原子的。后面要介绍的Atomic值就是依赖于这个实现的,保证了更新的原子性。...这个lock前缀是什么含义呢,可以看一下Intel的手册说明: 1、确保对内存的读-改-写操作原子执行。...(即包含该内存区域的缓存行当前处于独占或以修改状态),并且该内存区域被完全包含在单个缓存行(cache line)中,那么处理器直接执行该指令。...由于指令执行期间缓存行会一直被锁定,其它处理器无法读/写该指令要访问的内存区域,因此能保证指令执行的原子性。...MESI 另外上面提到的缓存一致性是存在对应的协议支持的,现在通用的协议MESI:(以下引自维基百科) MESI协议是基于Invalidate的高速缓存一致性协议,是支持回写缓存的最常见协议之一。

1.5K30

用动图的方式,理解 CPU 缓存一致性协议

我之前写过 CPU 缓存一致性 MESI 协议:10 张图打开 CPU 缓存一致性的大门。...然后期间挺多人对 MESI 协议的转换有疑问,其实我文章中把 MESI 协议状态切换的各个过程都总结成了一个表格,可能内容太多,很多小伙伴没有仔细看。...MESI 协议 MESI 协议其实是 4 个状态单词的开头字母缩写,分别是: Modified,已修改 Exclusive,独占 Shared,共享 Invalidated,已失效 这四个状态来标记...这个时候,如果要向独占的 Cache 写数据,就可以直接自由地写入,而不需要通知其他 CPU 核心,因为只有你这有这个数据,就不存在缓存一致性的问题了,于是就可以随便操作该数据。...显示内存地址和数据; 第二部分,CPU 缓存。显示 CPU 缓存的变量数据和 MESI 协议状态,因为我现在还没开始操作,所以显示的是空白。 第三部分,CPU 操作

96830

JUC并发编程之MESI缓存一致协议详解

3 缓存一致性是什么 MESI(Modified-Exclusive-Shared-Invalid)协议是一种广为使用的缓存一致性协议,类似读写锁 对于同一地址的读内存操作是并发的,针对同一地址的写操作独占的...为了保持数据的一致性,MESI缓存条目的状态划分为Modified.Exclusive,Shared,Invalid MESI协议中一个缓存条目的状态Flag值分为以下四种 1....如下图,就是MESI的概要图。 ? 通过上面的理论,还不好解释MESI协议CPU多核中到底是如何运用的,我会在下面通过几张图片的案例,来详细剖析它协议的转换过程。...CPU缓存中,它的缓存大小为64个字节,假如我们现在内存中有一个大对象,它的大小为124个字节,那么CPU中一个缓存行是无法进行存储的,它会将变量存储两个缓存中,这样的话CPU在对变量进行操作就不再是原子操作...,MESI协议无法同时对线程内的两个缓存行进行lock加锁,这时MESI协议失效,缓存行锁失效,从而晋升到bus总线锁。

59460

【深度长文】学好并发编程不一定需要了解的MESI和内存屏障

学好并发编程不一定需要了解的MESI和内存屏障 开篇 一、不同CPU设计的区别 单核CPU 单核+高速缓存 多核CPU + 高速缓存 二、缓存一致性协议MESI缓存行的状态 Exclusive Modified...因此可以通过总线上加锁的方式,来控制同一时间内,只有一个CPU能访问内存数据。 #Lock 信号会把总线上的并行化操作变成了串行,使得某个处理器能够独占内存。...因此这是一个锁粒度和开销都很大的操作 优点:多核CPU并行工作提升了计算机的处理速度 缺点: 带来了缓存一致性问题 总线锁的方式开销太大 二、缓存一致性协议MESI) 由于通过总线锁的方式来保证一致性所带来的性能开销太大...其它CPU对内存的读写请求都会被阻塞,直到锁释放,不过实际后来的处理器都采用锁缓存行替代锁总线,因为锁总线的开销比较大,锁总线期间其他CPU没法访问内存 当前存储缓存的写事务全部处理完毕。...MESI协议用于保证数据一致性,基于这份协议可以对高速缓存的数据何时同步到主存做一个控制。

53610

8.volatile为啥不能保证原子性?

小陈:哦,是不是可以这么理解: 如果要保证原子性的话,同一时刻只能有一个线程或者CPU能够执行成功,底层是需要对硬件进行加锁的,只有某个CPU或者线程锁定了,享有独占的权限,那么它的操作才能是不被其它CPU...老王:没错,就是这个道理;你只有硬件级别加锁了之后,享有独占的权限;你的操作才能是不被其它CPU或线程打断的。 小陈:好的,老王,这么说我就理解了。...再对之前的文章再复习复习,包括内存屏障、java内存模型、MESI一致性协议等知识,从下一章看是我们就要进入新的学习了。 小陈:好啊老王,下面的篇章我们要学习什么知识啊?...目录 JAVA并发专题 《筑基篇》 1.什么是CPU多级缓存模型? 2.什么是JAVA内存模型? 3.线程安全之可见性、有序性、原子是什么? 4.什么是MESI缓存一致性协议?...何时任务提交到阻塞队列? 阻塞队列满会发生什么? ThreadPoolExecutor 中的Worker是如何执行提交到线程池的任务的?多余Worker怎么超出空闲时间后被干掉的?

15650

从ObjectPool到CAS指令

多核 CPU 中,数据可能在内存或者 L1、L2、L3 中(如下图所示),我们如何保证能原子性的对某个数据进行操作?...现在 - P6 以后时代(锁缓存),新的处理器中,Intel 使用缓存锁定来保证指令执行的原子性,缓存锁定将大大降低 lock 前缀指令的执行开销。...现在这里的锁缓存(Cache Locking)就是用了 Ringbus + MESI 协议。...MESI协议是 Cacheline 四种状态的首字母的缩写,分别是修改(Modified)态、独占(Exclusive)态、共享(Shared)态和失效(Invalid)态。...同时,这个数据会被原子的写回到主存。最终,Cache 的状态又会变为 S。 关于MESI协议更详细的信息就不在本文中介绍了,计算机操作系统和体系结构相关书籍和资料中有更详细的介绍。

29420

5.volatile是什么?怎么保证可见性?

小陈:结合之前讲的MESI缓存一致性协议,看了一些资料。大概知道volatileJMM层次和CPU高速缓存层次是怎么确保可见性的了 老王:哦,这么机灵,那你来说说看.......所以执行assign赋值更新后的之后,立马执行store、write指令最新的值传递到主内存,并且赋值给主内存的变量。...小陈:之前我们了解过MESI一致性怎么实现可见性了,由于java内存模型建立CPU多级缓存模型之上,所以java内存模型底层也是通过MESI一致性的协议去达到可见性的目的,java内存模型会去适配不同操作系统对...MESI一致性协议的不同实现方式。...目录 JAVA并发专题 《筑基篇》 1.什么是CPU多级缓存模型? 2.什么是JAVA内存模型? 3.线程安全之可见性、有序性、原子是什么? 4.什么是MESI缓存一致性协议

16420

12 张图看懂 CPU 缓存一致性与 MESI 协议,真的一致吗?

那么,什么是缓存一致性问题,CPU Cache 的读取和写入过程是如何执行的,MESI 缓存一致性协议是什么?今天我们围绕这些问题展开。 ---- 学习路线图: ---- 1....提示: MESI 协议 MSI 的基础上增加了 E(独占)状态,以减少只有一份缓存的写操作造成的总线通信。...MESI 协议有一个非常 nice 的在线体验网站,你可以对照文章内容,在网站上操作指令区,并观察内存和缓存的数据和状态变化。...因此,现代的 CPU 会在增加写缓冲区和失效队列 MESI 协议的请求异步化,以提高并行度: 写缓冲区(Store Buffer) 由于写入操作之前,CPU 核心 1 需要先广播 RFO 请求获得独占权...4、MESI 协议能够满足以上 2 点特性,通过 “已修改、独占、共享、已失效” 4 个状态实现了 CPU Cache 的一致性; 5、现代 CPU 为了提高并行度,会在增加 写缓冲区 & 失效队列

2.7K14

变量如何在多线程下独善其身

图片 为什么线程之间的变量不可以共享 解决这个问题之前要先了解一下Java内存模型8大原子操作 1.lock(锁定) 作用于主内存的变量,把一个变量标记为一条线程独占状态 2.unlock(解锁)...8.write(写入) 把store操作从工作内存中的一个变量的值传送到主内存的变量中 ps:不是使用Volatile修饰的变量,执行引擎会一直从工作内存中读取数据。...这里 的“类型”意思是:抽象的内容是什么?汇编语言是对底层机器的轻微抽 象。接着出现的“命令式”语言(如 FORTRAN,BASIC 和 C)是对汇编语 言的抽象。...所以通过汇编lock前缀指令触发底层缓存机制(缓存一致性协议&总线锁) 例0如0触发MESI协议,lock指令会触发锁定变量缓存行区域并写回主内存, 这个操作称为“缓存锁定” 比较老的cpu使用的是总线锁机制...现在的缓存锁定机制机会都是缓存一致性协议MESI协议) java

22720

Memory Consistency and Cache Coherence—— cache一致性协议MESI

读写cache需要cache一致性协议保证数据正确,MESI协议规定了一块内存的五种状态:Modified(M,修改),Exclusive(E,独占),Share(S,共享),Invalid(I,无效)...,读取缺失广播到总线 处理器 写命中 已修改(M) 正常命中 数据写入本地缓存 处理器 写命中 共享(S) 一致性 失效操作广播到总线,使其它缓存了此块处理器缓存状态变为失效 处理器 写缺失 无效...独占状态,这样处理一些操作时可以减少总线通信。...MESI协议下,读取内存块如果其它cpu都是I状态,则当前cpu该块会变成E状态,然后写入的时候直接写就可以,不需要发送使该块失效的信号。...所以MESI协议首先要解决,如何确定没有其它共享者,而让本块变为E状态,比如可以添加一根共享信号线做或运算,每个cpu在读取内存修改状态时都要判断共享信号线,如果共享信号线为1,则将cache块状态置为

66210

内存模型是怎么解决缓存一致性的

Java内存模型是什么这篇文章中,我们介绍过关于Java内存模型的来龙去脉。...但是由于锁住总线期间,其他CPU无法访问内存,会导致效率低下。因此出现了第二种解决方案,通过缓存一致性协议来解决缓存一致性问题。...缓存一致性协议 缓存一致性协议(Cache Coherence Protocol),最出名的就是Intel 的MESI协议MESI协议保证了每个缓存中使用的共享变量的副本是一致的。...但是,值得注意的是,传统的MESI协议中有两个行为的执行成本比较大。 一个是某个Cache Line标记为Invalid状态,另一个是当某Cache Line当前状态为Invalid时写入新的数据。...用来解决缓存一致性问题的,常用的是MESI协议。 内存一致性模型。屏蔽计算机硬件问题,主要来解决并发编程中的原子性、有序性和一致性问题。 实现内存一致性模型的时候可能会用到缓存一致性模型。

1.1K30

Java程序员面试必备:Volatile全方位解析

2、通过缓存一致性协议(Cache Coherence Protocol) ❞ 总线 ❝总线(Bus)是计算机各种功能部件之间传送信息的公共通信干线,它是由导线组成的传输线束, 按照计算机所传输的信息种类...MESI协议 为了解决一致性问题,还可以通过缓存一致性协议。...即各个处理器访问缓存时都遵循一些协议,在读写时要根据协议来进行操作,这类协议有MSI、MESI(IllinoisProtocol)、MOSI、Synapse、Firefly及DragonProtocol...CPU缓存,各个缓存中的数据与主存数据相同 I,无效的(Invalid) 该缓存行数据是无效,需要时需重新从主存载入 MESI协议是如何实现的?...「多处理器总线嗅探」 嗅探技术 ❝多处理器下,为了保证各个处理器的缓存是一致的,就会实现缓存缓存一致性协议,每个处理器通过嗅探总线上传播的数据来检查自己的缓存值是不是过期了,如果处理器发现自己缓存行对应的内存地址被修改

41130

谢宝友: 深入理解 Linux RCU 之从硬件说起

简单的说,就是当某个原子操作完成时,确保所有CPU核已经识别到对原子变量的修改,并且原子操作期间,其他CPU核不会同步对该变量进行修改。这必然要求相应的电信号在所有的CPU之间广播。...四、为什么需要MESI 请不要说:我还不知道MESI是什么? 简单的说,MESI是一种内存缓存一致性协议。 现代CPU的速度比现代内存系统的速度快得多。...这些问题由“缓存一致性协议”来防止,常用的缓存一致性是MESI。...由于所有CPU必须维护缓存行中的数据一致性视图,因此缓存一致性协议提供消息以标识系统中缓存行的动作。 六、MESI消息 MESI协议需要在CPU之间通信。...Transition (i):其他某些CPU进行了一个原子读—修改—写操作,相应的缓存行仅仅被本CPU持有。本CPU缓存行变成无效状态。

4.5K31

3.线程安全之可见性、有序性、原子是什么

小陈:上一篇说了JAVA内存模型,但是后面说了多线程并发操作的时候有可见性问题,我现在迫不及待想知道线程安全的可见性、原子性、有序性是啥了 老王:哈哈,可以。...我搞个代码给你讲解一下: 线程A执行数据库、http客户端的初始化工作,初始化完毕之后initOk初始化表示置为true表示初始化完毕。...线程A被挂起期间,线程B就也执行了read、load指令变量x放入线程B的工作内存里了。...老王:小陈,给你个任务,你去看看MESI一致性协议的内容,下面我们讲解一下MESI一致性协议,以及MESI一致性协议是如何解决可见性问题的。...目录 JAVA并发专题 《筑基篇》 1.什么是CPU多级缓存模型? 2.什么是JAVA内存模型? 3.线程安全之可见性、有序性、原子是什么? 4.什么是MESI缓存一致性协议

17230

MESI协议,JMM,线程常见方法等

缓存一致性——MESI协议 CPU多级缓存官方概念 CPU摩尔定律的指导下以每18个月翻一番的速度发展,然而内存和硬盘的发展速度远远不及CPU,所以才引入了缓存的概念。...解决方式二——MESI协议(重点) 针对上面缓存数据不一致的情况,提出了MESI协议用以保证多个CPU缓存中共享数据的一致性,定义了缓存行Cache Line四个状态,分表是M(Modified),E(...8种原子操作(概念) 下面罗列的是8种原子操作,大家大概看看,下面详细描述。...上面说的MESI协议总线那边实践的,线程A,B可以同时获取主内存a的值,a进行自增操作之后进行操作6write写入的时候,会经过总线。...此篇是并发系列的基础,主要聊了硬件的MESI协议原子的八种操作,线程和进程的关系,线程的一些基础操作,JMM的基础等。如果有什么错误,或者不对的地方,欢迎指正。

66711

Java内存模型是什么

,因为CPU如果含有多个核心,则每个核心都有自己独占高速缓存,如果出现多个线程同时执行同一个操作,那么结果是无法预知。...通常使用的解决方法有2种:通过给总线加锁使用缓存一致性协议 第1种方法虽然也达到了目的,但是总线被锁住的期间,其他的CPU也无法访问主存,效率很低,所以就出现了缓存一致性协议即第2种方法,其中最出名的就是...Intel的MESI协议MESI协议保证每个CPU高速缓存中的变量都是一致的。...实际上这些问题并不需要我们考虑,这些问题CPU都会处理好,而CPU处理这些问题的时候是按照特定的操作规范,对特定的主存进行访问或告诉CPU高速缓存怎么访问主存,保证了多线程场景下的原子性、可见性、有序性...,既然是规范,那么不同的编程语言都可以遵循这种操作规范,多线程场景下访问主存保证原子性、可见性、有序性。

9110
领券