并发-JMM-CPU缓存一致性协议MESI

news2024/11/17 19:45:15

回顾

指令重排
在这里插入图片描述
第一V读,都不能指令重排;第二个V写,都不能指令重排
普通读写,写读都会发生指令重排,V写+普通读写会发生指令重排,普通读写+V读会发生指令重排

CPU缓存一致性协议MESI

java—》cpu的执行过程

.class文件–经过类装载子系统----装载到元空间----根据.class文件会在堆里生成Class结构化对象----创建线程栈----线程创建后机会执行.class中定义的方法的字节码—操作字节码的过程中需要程序计数器和解释执行器/jit优化转为汇编指令【字节码翻译成汇编指令,时间比较长】—再翻译成二进制供CPU读取【时间比较短】

CPU怎么知道什么时候调用这个线程呢?
答:
CPU用的是内核线程模型,在操作系统底层维护OS线程变量池【维护有线程表,当CPU调到该线程时,二进制就会方法CPU上执行 】,该线程池与JVM虚拟机栈是一对一的

volatile的加入,字节码显示会有lock前置锁----》触发硬件缓存锁定机制【总线锁、缓存一致性协议】
总线锁:早期使用总线保证缓存一致
早起CPU要是多核的话,导致两个CPU共同操作一个变量X【两个CPU都是读的话没问题】,要是两个CPU都对变量进行写的话,就会导致不知道执行哪个CPU的问题,所以前期就采用
lock前缀加总线锁
【总线的作用:CPU跟内存之间访问是通过总线进行的】
所以前期在总线上加lock前缀锁的时候就会影响CPU跟内存进一步的信息交流进而影响CPU的执行【CPU就类似于单核,CPU的多核效果发挥不出来】,导致性能很低

缓存一致性协议:
在这里插入图片描述
加入总线嗅探机制
CPU启动后采用监听模式一直监听总线

volatile可见性原理

加volatile后会在汇编层面加lock前缀,lock前缀就会触发缓存一致性协议,即时有多个线程同时进行操作,也能保持可见性
线程A与线程B从主存读取数据放到各自的工作内存,各标记S状态【共享,只有一个读取得时候是标记E状态(独占)】,当一个线程改了【改之前会加锁(锁缓存换行,缓存行为64字节大小,原子安全的;要是缓存行装不下,缓存一致性协议就会升级为总线锁),由总线去裁决哪个线程加锁】,改完后就会更改状态为M ,并写回主存,因为嗅探机制另一个线程就会嗅探到数据已更改就会改状态为I从而舍弃从新重主存读取数据

/*第一次把MESI理解的这么透彻! 举个栗子,使用volatile关键字修饰的属性,当两个或多个线程通过总线去主内存获取这个属性的值时,会对总线加一个lock前缀,早期总线加了lock前缀的话,其他线程都会阻塞,不能获取属性值,导致性能非常低。进而就设计出了缓存一致性协议,即MESI。MESI就是当线程1通过加了lock前缀的总线读取主内存数据到线程的工作内存后,会给这个属性加一个状态E,表示独占状态,这时如果另一个线程也通过总线到主内存读取该属性,复制到该线程的工作内存中,线程1感知到后属性状态就会从E边为S,即从独占状态变成共享状态,另一个线程中该属性的状态也是共享状态。如果两个线程都要修改这个属性的值,会对各自属性所在缓存行加一个锁,向总线发出加锁的消息,总线裁决后胜出的线程修改成功,更改属性状态为M状态,即修改状态,并且通知到其他线程,其他线程就会从S状态改变为I状态,即从共享状态改为无效状态,并且刷新缓存值。这就是MESI缓存一致性协议。 另外为什么说volatile能保证可见性和有序性,但无法保证原子性?因为volatile是对线程的工作内存有效,对寄存器是无效的,有可能寄存器已经读取到当前的属性值,之后属性值才被置为无效,这是刷新缓存值对寄存器也没有作用了,所以volatile保证不了原子性。*/

指令重排的原则happens-before

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/700275.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Three.js教程:高光网格材质Phong

推荐:将 NSDT场景编辑器 加入你的3D工具链 其他系列工具: NSDT简石数字孪生 高光网格材质Phong 高光网格材质MeshPhongMaterial和基础网格材质MeshBasicMaterial、漫反射网格材质MeshLambertMaterial一样都是网格模型的Mesh的材质。 高光网格材质MeshPho…

Web测试的主要内容和测试方法有哪些?

Web测试的主要内容: 一、输入框 二、搜索功能 三、增加、修改功能 四、删除功能 五、注册、登录模块 六、上传图片测试 七、查询结果列表 八、返回键检查 九、回车键检查 十、刷新键检查 Web测试的测试方法: 1.在测试时,与网络有关的步骤或者…

npm报错(npm ERR! Unexpected token ‘.‘)

使用 nvm 将 node 切换到高版本后,运行 npm 相关的命令报的这个错 解决办法: 1、通过nvm list 命令查看当前都安装的node版本列表,依次通过 nvm uninstall [version] 命令将已经安装的 node 版本依次删除。 [version] 代表 node 版本号。 2…

目标检测 pytorch复现Yolov4目标检测项目

目标检测 pytorch复现Yolov4目标检测项目 YOLOV4介绍YOLOV4结构解析1、主干特征提取网络Backbone2、特征金字塔3、YoloHead利用获得到的特征进行预测4、预测结果的解码 YOLOV4的训练1、YOLOV4的改进训练技巧2、loss组成 训练自己的YoloV4模型 YOLOV4介绍 YOLOV4结构解析 1、主…

官宣了!B站将以视频播放分钟数代替播放次数

6月26日,哔哩哔哩(以下简称“B站”)迎来了14周年庆。B站董事长兼CEO陈睿进行了以“很高兴遇见你”为主题的演讲。 在B站14岁的时候,陈睿就演讲向大家宣布:为了更好地挖掘B站的优质内容,B站将以播放分钟数替…

pyocd打包为exe后调用弹黑窗及pyocd的api调用的问题

打包为exe的程序中调用了cmd窗口,调用的时候会自动弹窗,这个弹窗用pyinstaller的-w的方法是不行的,参考RT-ThreadStudio的方法是如下图写一个.bat文件,关闭弹窗回显 echo off cd /D %~dp0 pyocd.exe %* 但一个原因是 它是0.1.1版…

git的指令

rebase 首先在master上切出一个新分支,叫dev 在dev上进行开发xxx 此时master上被他人提交了东西 想把这个master提交的东西移到dev上 最后统一合并到master上 步骤: 1.master上进行pull,确保本地是最新的 2.在dev上输入git rebase master …

【综合布线设计】网络杂谈(18)深入了解综合布线系统设计

涉及知识点 什么是综合布线系统设计,综合布线系统设计的原则,工作区子系统设计,水平子系统设计,垂直子系统设计,管理子系统设计,设备间子系统设计,建筑群子系统设计。深入了解综合布线系统设计…

二叉树OJ题:LeetCode--226.翻转二叉树

朋友们、伙计们,我们又见面了,本期来给大家解读一下LeetCode中第226道二叉树OJ题,如果看完之后对你有一定的启发,那么请留下你的三连,祝大家心想事成! 数据结构与算法专栏:数据结构与算法 个 人…

你真的学懂if语句了嘛,看完这篇文章你一定会让你有所收获,彻底玩转if语句!

📌(,・∀・)ノ゛hello ,欢迎来到鸽芷咕的个人频道。 📜 本博主是C/C领域的新星作者,平时喜欢分享一些编程经验和学习中的遇到的难题,喜欢不要忘了关注咯! ✅ 鸽芷咕: 个人…

Arrays类 (Java)

文章目录 1. 介绍2. 分析3. 方法3.1 toStriing()方法3.2 sort()方法 1. 介绍 A. 类介绍:  此类包含用来操作数组(比如排序和搜索)的各种方法。此类还包含一个允许将数组作为列表来查看的静态工厂. 2. 分析 A. 类包结构:java.uti…

linux-2.6.22.6内核nand flash框架分析

内核启动时会在串口打印nand flash的相关信息,通过该信息可定位到内核自带的nand flash相关驱动代码。 例如串口打印S3C24XX NAND Driver,搜索该字符串可找到/home/book/work/linux/linux-2.6.22.6/drivers/mtd/nand/s3c2410.c这个文件,这个…

The Company Requires Superficial StudyPHP 了解PHP ①

作者 : SYFStrive 博客首页 : HomePage 📜: The Company Requires PHP MYSQL 📌:个人社区(欢迎大佬们加入) 👉:社区链接🔗 📌:觉得文章不错可以…

webassembly性能优化

添加调试内容 性能查看 1.点击chrome的性能 2.点击录制按钮 3.开始启动性能分析之后,进行操作 4.操作完成后,点击停止。 5.ctrlf调出搜索,查看相关函数 6.从上到下查看具体耗时的操作。 其中上层包含下层时间。

购物车业务

一、分析购物车vo (1)添加成功页 public class CartItemVo implements Serializable {/*** 商品id*/private Long skuId;/*** 是否选中*/private Boolean check true;/*** 商品标题*/private String title;/*** 商品图片*/private String image;/***…

Redis6之哨兵模式

哨兵:是用于监控Redis集群中主节点状态的工具,是Redis高可用解决方案,哨兵可以监视一个或者多个redis 主节点,以及这些主节点的所有从节点。 某个主节点服务宕机后,会把这个主节点下的某个从节点升级为主节点来替代已宕…

软件测试技能,JMeter压力测试教程,监听器之灵活的文件写入(十六)

一、前言 JMeter使用Simple Data Writer插件具有非常简单的测试结果编写功能。文件格式仅限于XML和CSV,字段顺序已预定义。因此,你可能会发现Simple Data Writer不足以完成您的任务 Flexible File Writer插件允许以灵活的格式编写测试结果,…

HarmonyOS 4.0开发者Beta招募,快来报名尝鲜

作为一枚资深玩机党,相比同质化日趋严重的硬件配置,我对各大手机厂商的系统软件更感兴趣。把玩了几年iPhone、三星及国产安卓手机,沉浸体验了iOS、Android几番更新迭代,暮然回首——还是咱们“土生土长”的HarmonyOS更贴合我个人的…

如何使用Claude(超详细教程)

如何使用Claude(超详细教程) 1. 目前claude只支持在slack中使用 点击进入claude官网然后点击添加到Slack中 2. 跳转到Slack创建工作区 点击创建新的工作区(以前使用过Slack可用以前的工作区) 输入邮箱,建议谷歌邮箱登录(其他邮…

ValSuite报告可以帮助改善您的验证过程的6种方式

热验证工艺是一项复杂而微妙的工作,但它是确保制药和生物技术产品的安全性和有效性的重要组成部分。同时,管理整个验证过程中产生的数据可能很费时,而且容易出错——这就是ValSuite的意义。 这款直观的验证软件简化了数据分析和报告&#xf…