逐一解释一下四个 “内存屏障” 是什么

news2025/1/19 14:32:44

什么是内存屏障?硬件层⾯,内存屏障分两种:读屏障(Load Barrier)和写屏障(Store Barrier)。内存屏障有两个作⽤:

  1. 阻⽌屏障两侧的指令重排序;
  2. 强制把写缓冲区/⾼速缓存中的脏数据等写回主内存,或者让缓存中相应的数据失效。

注意这⾥的缓存主要指的是CPU缓存,如L1,L2等(这里所提到的缓存是指CPU缓存,例如L1,L2等级别的缓存。这是因为在计算机系统中,还存在其他类型的缓存,比如磁盘缓存、网络缓存等等。因此,这个主句的作用是强调内存屏障所涉及到的缓存类型,避免混淆。)

编译器在⽣成字节码时,会在指令序列中插⼊内存屏障来禁⽌特定类型的处理器重排序。编译器选择了⼀个⽐较保守的JMM内存屏障插⼊策略,这样可以保证在任何处理器平台,任何程序中都能得到正确的volatile内存语义。这个策略是:

  1. 在每个volatile写操作前插⼊⼀个StoreStore屏障;
  2. 在每个volatile写操作后插⼊⼀个StoreLoad屏障;
  3. 在每个volatile读操作后插⼊⼀个LoadLoad屏障;
  4. 在每个volatile读操作后再插⼊⼀个LoadStore屏障。

示意图⼤概是这个样⼦:

LoadLoad屏障:对于这样的语句Load1; LoadLoad; Load2,在Load2及后续读取操作要读取的数据被访问前,保证Load1要读取的数据被读取完毕。

StoreStore屏障:对于这样的语句Store1; StoreStore; Store2,在Store2及后续写⼊操作执⾏前,保证Store1的写⼊操作对其它处理器可⻅。

LoadStore屏障:对于这样的语句Load1; LoadStore; Store2,在Store2及后续写⼊操作被刷出前,保证Load1要读取的数据被读取完毕。

StoreLoad屏障:对于这样的语句Store1; StoreLoad; Load2,在Load2及后续所有读取操作执⾏前,保证Store1的写⼊对所有处理器可⻅。它的开销是四种屏障中最⼤的(冲刷写缓冲器,清空⽆效化队列)。在⼤多数处理器的实现中,这个屏障是个万能屏障,兼具其它三种内存屏障的功能

再介绍⼀下volatile与普通变量的重排序规则:

  1.  如果第⼀个操作是volatile读,那⽆论第⼆个操作是什么,都不能重排序;
  2. 如果第⼆个操作是volatile写,那⽆论第⼀个操作是什么,都不能重排序;
  3. 如果第⼀个操作是volatile写,第⼆个操作是volatile读,那不能重排序。

如果是下列情况:第⼀个操作是普通变量读,第⼆个操作是volatile变量读,那是可以重排序的:

// 声明变量
int a = 0; // 声明普通变量
volatile boolean flag = false; // 声明volatile变量
// 以下两个变量的读操作是可以重排序的
int i = a; // 普通变量读
boolean j = flag; // volatile变量读

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

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

相关文章

Matplotlib绘图

1.散点图 X1 [[3.393533211, 2.331273381], [3.110073483, 1.781539638], [1.343808831, 3.368360954], [3.582294042, 4.679179110], [2.280362439, 2.866990263], [7.423436942, 4.696522875], [5.745051997, 3.533989803], [9.172168622, 2.51…

面试官:说说MySQL主从复制原理

MySQL Replication(主从复制)是指数据变化可以从一个MySQL Server被复制到另一个或多个MySQL Server上,通过复制的功能,可以在单点服务的基础上扩充数据库的高可用性、可扩展性等。 一、背景 MySQL在生产环境中被广泛地应用&…

第十四届蓝桥杯题解

声明:以下都无法确定代码的正确性,是赛时代码,希望大家见谅!思路可以参考,等后续可以评测之后再去修改博客内错误,也希望大家能够指正错误! 试题A:日期统计 分析:这道题…

Linux工具——yum和vim

目录🍏Linux软件包管理器-yum🍎yum简介🍎rzsz工具🍎注意事项🍎软件包查看🍎如何安装和卸载软件🍏Linux编辑器-vim🍎vim的基本概念🍎vim的基本操作🍎vim正常模…

uniapp中canvas绘制图片内容空白报错原因总结

uniapp中canvas绘制图片内容空白报错原因总结,看完需要10分钟 问题图: 效果图: 目录 🧨🧨🧨首先定义画布canvas canvas画布初始值没有,导致没有绘制成功 🧨🧨🧨2.绘制图…

【二叉树】全家桶-管饱,你敢吃吗?

【二叉树扩展学习】💯💯💯1.【二叉树的创建】2.【二叉树的销毁】3.【二叉树的前序遍历】4.【二叉树的中序遍历】5.【二叉树的后序遍历】6.【二叉树的层序遍历】7.【二叉树的高度】8.【二叉树结点的个数】9.【第K层二叉树的结点个数】10.【二叉…

C语言之结构体内存对齐与内存的简单理解

文章目录 内存单元的理解结构体中内存对齐的规则为什么会存在内存对齐一、内存单元的理解 首先先要介绍一下C语言中一些常见的存储单元 bit 存放一个二进制位 Byte 1Byte 8 bit KB 1KB 1024 Byte MB 1MB 1024 KB GB 1GB 1024 M…

Linux对文件夹操作(复制,移动)

Linux对文件夹操作(复制,移动) 复制文件夹cp cp -a vue vue-copy将vue 文件夹下面的所有文件,复制到同目录下vue-copy文件夹下面 -a:相当于 -d、-p、-r 选项的集合,这几个选项我们一一介绍;-d:如果源文件为软链接(…

数据库开发(Sqlite)

1、数据库开发 1.1 数据与数据管理 什么是信息?   信息是指对现实世界存在方式或运动状态的反应。 什么是数据?   数据是指存储在某一媒体上,能够被识别的物理符号;   数据的概念在数据处理领域已经被大为拓宽&#xff0c…

qt5.14.2 独立msvc环境搭建(不安装vs)

一般情况下msvc下的qt开发,无论你是用qtcreator还是vs都推荐安装对应vs版本,这样是最省事和便捷的,但在有些情况下不便安装vs但项目又需要使用msvc,则可以只安装msvc c编译器,步骤如下: 备注:文…

【Spring Clound】Feign底层原理分析-自动装载动态代理

文章目录前言1、什么是Feign?2、为什么要使用Feign?3、Feign依赖注入原理3.1、Feign自动装载3.2、FeignClientFactoryBean#getObject4、总结前言 是一个HTTP请求调用轻量级框架,可以以Java接口注解的方式调用HTTP请求,而不用像Ja…

Lunabot一款无需密钥魔法就能使用到ChatGPT的浏览器工具

Lunabot 简介 Lunabot是一款跨平台的ChatGPT助手,支持主流浏览器上的任意网页,可以快速处理各种任务,提高您的工作效率。使用 Lunabot,您可以轻松选择文本并使用快速命令和提示来快速处理任务,同时还可以保存永远不会…

Node【二】NPM

文章目录🌟前言🌟NPM使用🌟NPM使用场景🌟NPM的常用命令🌟NPM命令使用介绍🌟 使用NPM安装模块🌟 下载三方包🌟 全局安装VS本地安装🌟 本地安装🌟 全局安装&…

研读Rust圣经解析——Rust learn-5(所有权,强大的String)

研读Rust圣经解析——Rust learn-5(所有权,强大的String)所有权栈和堆相同点栈堆所有权规则作用域StringString创建String创建空字符串从字符串字面量创建(将&str转化为String)str特点创建str所有权转移String源码深克隆clone…

Matplotlib基本图形使用折线图-柱状图-散点图-饼图的完整代码含示例

目录 Matplotlib基本折线图的使用 1. 导入matplotlib库 2. 准备数据 3. 绘制折线图 4. 加上标签和标题 5. 自定义样式 6. 完整代码 ​编辑 绘制散点图 导入 matplotlib 库和 numpy 库 准备数据 绘制散点图 ​编辑 绘制饼图 导入 matplotlib 库和 numpy 库 准备数…

JS尺寸相关

文章目录元素偏移量 offset 系列offset 系列常用属性offset 与 style 区别获取鼠标在盒子内的坐标模态框放大镜效果元素client 系列元素client系列属性元素滚动 scroll 系列元素 scroll 系列属性页面被卷去的头部兼容性解决方案监听滚动效果仿淘宝固定侧边栏缓动动画筋斗云案例…

实战打靶集锦-015-djinn3

提示:本文记录了作者一次曲折的打靶提权经历 目录1. 主机发现2. 端口扫描3. 服务枚举4. 服务探查4.1 Lighttpd探查4.1.1 浏览器探查4.1.2 EXP搜索4.1.2.1 CVE-2019-110724.1.2.2 CVE-2018-190524.2 Werkzeug探查4.2.1 浏览器探查4.2.2 EXP搜索4.2.2.1 目录遍历4.2.2…

Stable Diffusion Web UI + Anaconda环境 + 本地Windows系统部署

Stable Diffusion Web UI Anaconda环境 本地Windows系统部署 最近的很多AIGC模型层出不穷,Stable Diffusion 模型作为一个开源的热门生成式模型,或许对未来的各行各业都能产生深远的影响,了解这个模型并会使用可能是很多人目前想要学习的&…

车载Mini LED持续升温,各家厂商进展如何?

去年,Mini LED背光技术在车载显示赛道上初露头角,多款搭载 Mini LED 屏幕的汽车陆续发布。随着新能源车渗透率的提高,车载显示成为明确增长的赛道,为Mini LED背光进入车载带来利好。 结合今年各家厂商披露的信息来看&#xff0c…

浮点型数据在内存的存储方式

目录 大体规则 特殊规定 由于浮点型在内存中的存储方式相较于整型的要复杂一些,而且很容易忘掉,所以就将部分知识点整理了一下,写成一篇博客。 大体规则 根据国际标准(电气和电子工程协会)IEEE 754,任意…