从ARMv7指令集开始,ARM提供3条内存屏障指令。

(1)数据存储屏障( Data Memory Barrier,DMB)
数据存储器隔离。DMB指令保证:仅当所有在它前面的存储器访问操作都执行完毕后,才提交( commit)在它后面的存取访问操作指令。当位于此指令前的所有内存访问均完成时,DMB指令才会完成

(2)数据同步屏障( Data synchronization Barrier,DSB)
数据同步隔离。比DMB要严格一些,仅当所有在它前面的存储访问操作指令都执行完毕后,才会执行在它后面的指令,即任何指令都要等待DSB前面的存储访问完成。位于此指令前的所有缓存,如分支预测和TLB( Translation Look- aside Buffer)维护操作全部完成

(3)指令同步屏障( Instruction synchronization Barrier,ISB)
指令同步隔离。它最严格,冲洗流水线( Flush Pipeline)和预取buer( pretcLbuffers后,才会从 cache或者内存中预取ISB指令之后的指令。ISB通常用来保证上下文切换的效果,例如更改ASID( Address Space Identifier)、TLB维护操作和C15寄存器的修改等。

内存屏障指令的使用例子如下。
例1:假设有两个CPU核A和B,同时访问 AddrE和Addr2地址。

Core A:
STR R0, [Addr1]
LDR R1, [Addr2]
Core B:
STR R2, [Addr2]
LDR R3, [Addr1]

对于上面代码片段,没有任何的同步措施。对于 Core A、寄存器R1、 Core B和寄存器R3,可能得到如下4种不同的结果。

  • A得到旧的值,B也得到旧的值。
  • A得到旧的值,B得到新的值。
  • A得到新的值,B得到旧的值。
  • A得到新的值,B得到新的值。

例2:假设 Core a写入新数据到Msg地址, Core B需要判断flag标志后才读入新数据。

Core A
STR R0,[Msg] @写新数据到Msg地址
STR R1,[F1ag] @F1ag标志新数据可以读
Core B
Poll loop:
LDR R1, [Flag]
CMP R1, #0 @判断flag有没有置位
BEQ Poll loop
LDRR0,[Msg] @读取新数据

在STR 存储指令之后插入DSB指令,强制让写命令完成,然后执行读取flag的判断循环;

ARM有几条memory barrier 的指令?分别有什么区别?的更多相关文章

  1. Linux内核同步机制之(三):memory barrier【转】

    转自:http://www.wowotech.net/kernel_synchronization/memory-barrier.html 一.前言 我记得以前上学的时候大家经常说的一个词汇叫做所见即 ...

  2. Linux内核同步 - memory barrier

    一.前言 我记得以前上学的时候大家经常说的一个词汇叫做所见即所得,有些编程工具是所见即所得的,给程序员带来极大的方便.对于一个c程序员,我们的编写的代码能所见即所得吗?我们看到的c程序的逻辑是否就是最 ...

  3. memory barrier 内存栅栏 并发编程

    并发编程 memory barrier (内存栅栏) CPU级 1.CPU中有多条流水线,执行代码时,会并行进行执行代码,所以CPU需要把程序指令 分配给每个流水线去分别执行,这个就是乱序执行: 2. ...

  4. 理解 Memory barrier

    理解 Memory barrier(内存屏障) 发布于 2014 年 04 月 21 日2014 年 05 月 15 日 作者 name5566 参考文献列表:http://en.wikipedia. ...

  5. 内存栅栏(memory barrier):解救peterson算法的应用陷阱

    最近一个项目中用到了peterson算法来做临界区的保护,简简单单的十几行代码,就能实现两个线程对临界区的无锁访问,确实很精炼.但是在这不是来分析peterson算法的,在实际应用中发现peterso ...

  6. 内存屏障 & Memory barrier

    Memory Barrier http://www.wowotech.net/kernel_synchronization/memory-barrier.html 这里面讲了Memory Barrie ...

  7. Why Memory Barrier?

    引言:xchg做了什么? 首先,xchg eax, ecx并不会比mov edx, eax + mov eax, ecx + mov ecx, edx这三条指令加一起快,原因是xchg有副作用. Mi ...

  8. memory barrier 内存屏障 编译器导致的乱序

    小结: 1. 很多时候,编译器和 CPU 引起内存乱序访问不会带来什么问题,但一些特殊情况下,程序逻辑的正确性依赖于内存访问顺序,这时候内存乱序访问会带来逻辑上的错误, 2. https://gith ...

  9. 内存屏障(Memory barrier)-- 转发

    本文例子均在 Linux(g++)下验证通过,CPU 为 X86-64 处理器架构.所有罗列的 Linux 内核代码也均在(或只在)X86-64 下有效. 本文首先通过范例(以及内核代码)来解释 Me ...

随机推荐

  1. java开发,年薪15W的你和年薪50W的他的差距

      在这个IT系统动辄就是上亿流量的时代,Java作为大数据时代应用最广泛的语言,诞生了一批又一批的新技术,包括HBase.Hadoop.MQ.Netty.SpringCloud等等 .   一些独角 ...

  2. appium-doctor

    1.   I installed appium-1.5.3.dmg But when I click the stethoscope button the Appium is show error : ...

  3. 14-03 java BigInteger类,BigDecimal类,Date类,DateFormat类,Calendar类

    BigInteger类 发 package cn.itcast_01; import java.math.BigInteger; /* * BigInteger:可以让超过Integer范围内的数据进 ...

  4. CentOS 6.5 网络服务器功能的实现②:运用光盘(镜像)制作一个本地yum源

    在用Linux安装软件时(rpm安装方式),有时会出现“包依赖”的现象.因此,我们可以用yum工具来实现一次性安装所有rpm工具包的功能. 实例:在此服务器上用yum的方式安装DHCP服务和TFTP服 ...

  5. Java并发编程之synchronized关键字

    整理一下synchronized关键字相关的知识点. 在多线程并发编程中synchronized扮演着相当重要的角色,synchronized关键字是用来控制线程同步的,可以保证在同一个时刻,只有一个 ...

  6. Java 在 CMD 环境下编译

    1. 未引用第三方 Jar 包类(该 Java 类默认无包名) # 定位到类存放地址 cd E:\tsgg # 编译命令 javac Test.java # 执行命令 java Test 2. 引用第 ...

  7. js------科学计数法转换为正常小数

    // toD.js文件export default (val) => { const e = String(val) let rex = /^([0-9])\.?([0-9]*)e-([0-9] ...

  8. Topshelf 学习 跨平台【转载】

    Topshelf 学习 跨平台   Topshelf是一个开源的跨平台的宿主服务框架,支持Windows和Mono,只需要几行代码就可以构建一个很方便使用的服务宿主. 官网:http://topshe ...

  9. oracle创建用户、创建表空间、授权、建表

    2.然后我就可以来创建用户了. create user zzg identified by zzg123; 3.创建好用户我们接着就可以修改用户的密码. alter user zzg identifi ...

  10. Oracle11g em启动报此网站的安全证书有问题的解决方案

    http://blog.sina.com.cn/s/blog_a32eff280101cgje.html C:\>emctl status dbconsoleOracle Enterprise ...