Memory barrier(内存屏障)
内存屏障(英语:Memory barrier),也称内存栅栏,内存栅障,屏障指令等,是一类同步屏障指令,是CPU或编译器在对内存随机访问的操作中的一个同步点,使得此点之前的所有读写操作都执行后才可以开始执行此点之后的操作。
大多数现代计算机为了提高性能而采取乱序执行,这使得内存屏障成为必须。
语义上,内存屏障之前的所有写操作都要写入内存;内存屏障之后的读操作都可以获得同步屏障之前的写操作的结果。因此,对于敏感的程序块,写操作之后、读操作之前可以插入内存屏障。
--------摘自维基百科 memory barrier inter 称之为memory fence
意思是说因为现在计算机为了提高性能采用了乱序执行,才有屏障等指令(概念)
那乱序执行又是指什么?
在计算机工程领域,乱序执行(错序执行,英语:out-of-order execution,简称OoOE或OOE)是一种应用在高性能微处理器中来利用指令周期以避免特定类型的延迟消耗的范式。在这种范式中,处理器在一个由输入数据可用性所决定的顺序中执行指令,而不是由程序的原始数据所决定。在这种方式下,可以避免因为获取下一条程序指令所引起的处理器等待,取而代之的处理下一条可以立即执行的指令。
循序运行
主条目:指令周期
在早期的处理器中,指令的执行一般在以下的步骤中完成:
- 指令获取。
- 如果输入的运算对象是可以获取的(比如已经存在于寄存器中),这条指令会被发送到合适的功能单元。如果一个或者更多的运算对象在当前的时钟周期中是不可获取的(通常需要从主存获取),处理器会开始等待直到它们是可以获取的。
- 指令在合适的功能单元中被执行。
- 功能单元将运算结果写回寄存器。
乱序执行
这种范式通过以下步骤挑选可执行的指令先运行:
- 指令获取。
- 指令被发送到一个指令序列中(也称执行缓冲区或者保留站)。
- 指令将在序列中等待直到它的数据运算对象是可以获取的。然后指令被允许在先进入的、旧的指令之前离开序列缓冲区。
- 指令被分配给一个合适的功能单元并由之执行。
- 结果被放到一个序列中。
- 仅当所有在该指令之前的指令都将他们的结果写入寄存器后,这条指令的结果才会被写入寄存器中。这个过程被称为毕业或者退休周期。
乱序执行的重要概念是实现了避免计算机在用于运算的对象不可获取时的大量等待。在上述文字的要点中,乱序执行处理器避免了在顺序执行处理器处理过程第二步中当指令由于运算数据未到位所造成的等待。
b = a * 5
v = *b
c = a + 3
由于1与3可并发运行,而2之b无法随即获得,因此可以先计算乘法1与加法3,再运行2。
乱序执行使用其他“可以执行”的指令来填补了时间的空隙,然后再在结束时重新排序运算结果来实现指令的顺序执行中的运行结果。指令在原始计算机代码中的顺序被称为程序顺序,在处理器中他们被按照数据顺序中被处理,这种顺序中,数据,运算符,在计算机寄存器中变得可以获取。一般来说乱序执行需要复杂的电路来实现转换一种顺序到另一中顺序并且维护在输出时的逻辑顺序;而处理器本身就好像是随机执行的样子。
乱序执行所带来的益处随着指令管道的加深和主存(或者缓存)和处理器间的速度差的变大而增长。在现代计算机中,处理器的运算速度大大超越了内存速度,所以在顺序执行处理器等待数据的过程中,乱序执行处理器能够执行大量的指令。
--------摘自维基百科
参考:
https://stackoverflow.com/questions/286629/what-is-a-memory-fence
https://zh.wikipedia.org/wiki/%E4%B9%B1%E5%BA%8F%E6%89%A7%E8%A1%8C
https://zh.wikipedia.org/wiki/%E5%86%85%E5%AD%98%E5%B1%8F%E9%9A%9C
Memory barrier(内存屏障)相关推荐
- 内存屏障 Memory Barriers
内存屏障 Memory Barriers 在上一篇文章中我们提到了编译时的内存序重排导致的问题以及解决方法,即添加编译器屏障或处理器屏障指令.这篇文章将探讨内存屏障的语义. 内存屏障的类型 Types ...
- 一、barrier指令DSB,DMB,ISB,fence——内存屏障,指令屏障
最近工作中遇到一个问题,大致描述一下: 我们SOC用的arm cortex m7内核,在设计时设计人员图方便,将SPI controller的寄存器(即原本应该是APB空间)放在了0x60000000 ...
- 初步认识Volatile-CPU层面的内存屏障
什么是内存屏障?从前面的内容基本能有一个初步的猜想,内存屏障就是将 store bufferes中的指令写入到内存,从而使得其他访问同一共享内存的线程的可见性. X86的memory barrier指 ...
- 搞懂Linux内存屏障(值得收藏)
1.编译器 编译器将符合人类思考的逻辑(c代码)翻译成了符合CPU运算规则的汇编指令,编译器了解底层CPU的思维模式,因此,它可以在将c翻译成汇编的时候进行优化(例如内存访问指令的重新排序),让产出的 ...
- 十一、kotlin的协程 - 缓存、volatile、内存屏障和cas(四) --- 跑题篇
本章写着写着就跑题了, 又不舍得删除, 新手看 # 协程的共享变量安全问题简单入门和## volatile 不保证原子性部分代码, 其他可以不看, 太乱, 也没用 协程的共享变量安全问题简单入门 在使 ...
- 内存屏障(Memory Barrier)(二)什么是读屏障?
<内存屏障(Memory Barrier)(一)什么是写屏障?> <内存屏障(Memory Barrier)(二)什么是读屏障?> <内存屏障(Memory Barrie ...
- 内存屏障(Memory Barrier)与volatile
1. 写缓存(Store Buffer) 写缓存是一个容量极小的高速存储部件,每个核都有自己的写缓存,而且一个核不能够读取到其他核的写缓存(Store Buffer)的内容. 如上面的场景,核A修改共 ...
- 理解 Memory barrier(内存屏障)无锁环形队列
Memory barrier 简介 程序在运行时内存实际的访问顺序和程序代码编写的访问顺序不一定一致,这就是内存乱序访问.内存乱序访问行为出现的理由是为了提升程序运行时的性能.内存乱序访问主要发生在两 ...
- 理解 Memory barrier(内存屏障)【转】
转自:http://name5566.com/4535.html 参考文献列表: http://en.wikipedia.org/wiki/Memory_barrier http://en.wikip ...
- 一文讲解,Linux内核——Memory Barrier(内存屏障)
本文例子均在 Linux(g++)下验证通过,CPU 为 X86-64 处理器架构.所有罗列的 Linux 内核代码也均在(或只在)X86-64 下有效. 本文首先通过范例(以及内核代码)来解释 Me ...
最新文章
- (转)Unity3D - 性能优化之Draw Call
- linux第三方模块参数,Swift on Linux – 导入第三方模块
- 【Android 插件化】Hook 插件化框架 ( 通过反射获取 “宿主“ 应用中的 Element[] dexElements )
- Python学习笔记:面向对象编程(4)
- SegmentFault 创始人祁宁对话 C# 之父 Anders Hejlsberg
- pow(x,y)函数
- 伺服怎么接单相220伏_乐利网带你认识伺服电机及工作原理
- 从零开始拿到了Kaggle竞赛冠军
- 二十个让你泪流满面的瞬间
- 利用Scrapy框架爬取落网上的音乐文件
- 字符编码过滤器中对特殊的路径进行特殊处理
- code128java字符_java相关:如何使用Code128字体将文本转换为code128条形码
- kerberos安全认证
- 如何获取web视频数据流的传输?小姐姐的视频都被我爬下来了,这谁顶得住
- matlabadftest_adf检验matlab程序
- 共享文件服务器管理软件,企业共享文件管理软件 局域网文件共享工具的选择...
- VS软件设置中的宏定义
- 地域和地方的区别_地方、地域、地区、地面、地段的区别_近义词词典_词林在线词典...
- 【Pytorch基础教程34】EGES召回模型
- 【SCAU 新生赛】18247 aler的旅游计划 并查集模板题
热门文章
- 什么是数据库连接池?为什么使用数据库连接池?数据库连接池工作原理
- PHP 大地坐标系转高德经纬度
- Parasoft c++test安装使用导引
- MapGISnbsp;K9nbsp;SP3amp;nb…
- 基于Struts2的网上书城(仿当当网)系统设计与实现
- python毕业设计总结范文大全_毕业论文设计总结范文.docx
- java转码mp4的代码_JAVA视频格式转换 avi转mp4
- Python学习:Python分析中国人口(一)爬取数据
- 提供淘宝进销存管理软件
- 云计算ACP认证考试题库之101-200