memory barrier, also known as a membarmemory fence or fence instruction, 是一种屏障指令,它使中央处理单元(CPU)或编译器对在屏障指令之前和之后发出的内存操作强制执行排序约束。这通常意味着,在 屏障之前发出的操作 保证在 屏障之后发出的操作 之前执行。

当程序在单CPU计算机上运行时,硬件执行必要的簿记,以确保程序执行时就像所有内存操作都按照程序员指定的顺序执行一样(程序顺序),因此不需要内存屏障。但是,当内存与多个设备共享时,例如多处理器系统中的其他CPU或内存映射的外围设备,无序访问可能会影响程序行为。例如,第二CPU可以看到第一CPU在与程序顺序不同的序列中进行的存储器更改。

以下两个处理器程序给出了这种无序执行如何影响程序行为的示例:最初,内存位置x和f都保持值0。在处理器#1上运行的程序在f为零时循环,然后打印x的值。在处理器#2上运行的程序将值42存储到x中,然后将值1存储到f中。这两个程序片段的伪代码如下所示.程序的步骤对应于各个处理器指令。

Processor #1:

 while (f == );
// Memory fence required here
print x;

Processor #2:

 x = ;
// Memory fence required here
f = ;

人们可能会期望print语句总是打印数字“42”;然而,如果处理器#2的存储操作被无序执行,那么f就有可能在x之前被更新,而print语句因此可能会打印“0”。

类似地,处理器#1的加载操作可能会被无序执行,并且在检查f之前可以读取x,因此print语句可能再次打印出一个意外的值。对于大多数程序来说,这两种情况都是可以接受的。
可以在处理器#2分配给f之前插入内存屏障,以确保在f值变化时或之前,其他处理器都可以看到x的新值。另一个可以插入到处理器#1对x的访问之前,以确保在看到f值的变化之前,不读取x的值。

Memory barrier,的更多相关文章

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

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

  2. 并行计算之Memory barrier(内存

    本文转载自:http://name5566.com/4535.html 参考文献列表:http://en.wikipedia.org/wiki/Memory_barrierhttp://en.wiki ...

  3. 理解 Memory barrier

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

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

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

  5. Why Memory Barrier?

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

  6. 理解 Memory barrier(内存屏障)无锁环形队列

    原文:https://www.cnblogs.com/my_life/articles/5220172.html Memory barrier 简介 程序在运行时内存实际的访问顺序和程序代码编写的访问 ...

  7. 理解 Memory barrier(内存屏障)【转】

    转自:http://name5566.com/4535.html 参考文献列表:http://en.wikipedia.org/wiki/Memory_barrierhttp://en.wikiped ...

  8. Linux内核同步 - memory barrier

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

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

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

随机推荐

  1. 点击手机返回键弹出Dialog对话框功能

    在程序中,我们为了防止出现客户在使用程序填信息或者浏览页面时因误点返回键造成关闭界面的现象,需要添加弹出框功能,以确认客户是否要退出本界面,下面是功能实现的代码: 1.点击手机返回键的判断 publi ...

  2. C++的ofstream与ifstream使用

    基本理解: ofstream是从内存到硬盘,ifstream是从硬盘到内存,其实所谓的流缓冲就是内存空间; 在C++中,有一个stream这个类,所有的I/O都以这个“流”类为基础的,包括我们要认识的 ...

  3. snmp相关网址

    https://blog.csdn.net/wangcg123/article/details/53837737 https://www.linuxidc.com/Linux/2012-05/6114 ...

  4. Git 学习第三天(一)

    远程克隆: 在github新建一个仓库,起名为gitskills 勾选此项,会自动创建一个readme.md文件,然后通过命令 git clone git@github.com:Your.name/g ...

  5. centOs7 java启动jar 并部署到nginx

    简单启动命令 启动命令: nohup java –jar 项目名 & 注意1.加&表示一直后台运行,不加表示临时运行,关闭窗口项目即停止运行2.nohup:即项目在运行前新建一个noh ...

  6. CM 安装cdh 版本及出现问题

    添加节点: 安装完cdh 后jps出现:process information unavailable 解决办法:

  7. 判断IE版本与各浏览器的语句

    ---恢复内容开始--- 一.IE下判断IE版本的语句 <!--[if lte IE 6]> <![endif]--> IE6及其以下版本可见    <!--[if lt ...

  8. mysql数据库 --表查询

    今日内容: 一.单表查询 1.语法执行顺序 2.where约束条件 3.group by 4.having 5.distinct 6.order by 7.limit 8.正则 二.多表查询 1.表查 ...

  9. BBS论坛 后台管理

    七.后台管理 后台管理页面: <!DOCTYPE html> <html lang="en"> <head> <meta charset= ...

  10. Spring mvc Hello World

    Spring mvc Hello World 添加依赖 <dependency> <groupId>org.springframework</groupId> &l ...