MESI缓存一致性协议

MESI中每个缓存行都有四个状态,分别是E(exclusive)、M(modified)、S(shared)、I(invalid)。

M:代表该缓存行中的内容被修改了,并且该缓存行只被缓存在该CPU中。这个状态的缓存行中的数据和内存中的不一样,在未来的某个时刻它会被写入到内存中(当其他CPU要读取该缓存行的内容时。或者其他CPU要修改该缓存对应的内存中的内容时(个人理解CPU要修改该内存时先要读取到缓存中再进行修改),这样的话和读取缓存中的内容其实是一个道理)。
在这里插入图片描述

E:E代表该缓存行对应内存中的内容只被该CPU缓存,其他CPU没有缓存该缓存对应内存行中的内容。这个状态的缓存行中的内容和内存中的内容一致。该缓存可以在任何其他CPU读取该缓存对应内存中的内容时变成S状态。或者本地处理器写该缓存就会变成M状态。
在这里插入图片描述

S:该状态意味着数据不止存在本地CPU缓存中,还存在别的CPU的缓存中。这个状态的数据和内存中的数据是一致的。当有一个CPU修改该缓存行对应的内存的内容时会使该缓存行变成 I 状态。
在这里插入图片描述

I:代表该缓存行中的内容时无效的。
在这里插入图片描述

在多线程环境中,Java内存模型(JMM)通过定义happens-before原则利用底层硬件缓存一致性协议(如MESI协议)来确保变量的可见性线程间的数据同步。首先,happens-before原则是一系列编译器处理器必须遵守的规则集合,它规定了程序中操作的执行顺序,保证了特定的操作对其他操作可见。例如,如果操作A在操作B之前发生,并且A对共享变量进行了修改,那么B操作保证能观察到A对变量的修改效果。 参考资源链接:[Java内存模型:理解CPU缓存与一致性协议](https://wenku.youkuaiyun.com/doc/3inc30bh3h?spm=1055.2569.3001.10343) 为了实现这一原则,Java内存模型规定了内存屏障的使用。内存屏障是一种特殊的CPU指令,它可以控制指令的重排序,并确保执行顺序的正确性。通过插入适当的内存屏障,可以保证操作的可见性,即使是在不同的CPU核心或处理器之间。 同时,为了在硬件层面解决缓存一致性问题,JMM通常依赖于底层CPU架构提供的缓存一致性协议MESI协议是其中一种广泛使用的协议,它定义了缓存行的四种状:Modified、Exclusive、Shared、Invalidated。当一个核心对共享变量进行写操作时,它将缓存行的状标记为Modified,并通过总线或其他通信机制通知其他核心该缓存行已被修改。其他核心随后将它们自己的对应缓存行标记为Invalidated,这样就能确保当核心再次访问该变量时,能从主存或其他核心的缓存中获得最新值,从而保持数据的一致性。 通过这种内存模型的规范硬件层面的配合,Java程序能够有效地在多线程环境中运行,同时保证了程序的正确性性能。如果你对Java内存模型CPU缓存一致性有更深入的研究兴趣,建议阅读《Java内存模型:理解CPU缓存与一致性协议》这本资料,它详细解释了内存模型的各个方面以及它们是如何影响并发编程的。 参考资源链接:[Java内存模型:理解CPU缓存与一致性协议](https://wenku.youkuaiyun.com/doc/3inc30bh3h?spm=1055.2569.3001.10343)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值