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. 第一个脚本 "Hello World!"

    打开记事本就可以编辑脚本,REM就相当于注释,和脚本语言一样 REM Hello World GUI r DELAY STRING notepad ENTER DELAY STRING Hello W ...

  2. delphi基础篇之数据类型概论

    delphi基础篇之数据类型概论 Object Pascal 语言提供了非常丰富的数据类型,即简单类型(Simple).字符串类型(String).结构类型(Struct).指针类型(Pointer) ...

  3. source insight和vim同时使用

    https://blog.csdn.net/wangn222/article/details/72721993 1.Source Insight中,Options->Custom Command ...

  4. HTML中<frameset>标签不显示的问题

    啥都不说,先上代码 <html> <head> <title>index</title> <meta content = 'text/html'; ...

  5. 统计HDFS 上字节数据统计

    class HDFSWordCount { def main (args: Array[String]) { if (args.length > 0){ for (line <- Sour ...

  6. java-day02

    数据类型自动转换 要求:数据范围从小到大 数据类型强制类型转换 格式:范围小的数据类型 范围小的变量名 = (范围小的数据类型)原范围大的数据 注意事项: 1.可以会造成数据溢出或者是精度损失. 2. ...

  7. Centos下的 docker安装

    安装一些必要的系统工具:sudo yum install -y yum-utils device-mapper-persistent-data lvm2 添加软件源信息:sudo yum-config ...

  8. 案例-html5新标签-input和video

    <form action=""> <fieldset> <!--fieldset标签:可将表单内的元素分组 ,常与legend搭配使用--> & ...

  9. @value传值到static字段

    解决办法: 1.将这两个私有属性的set方法从私有变成公开(private -->>> public); 2.生成这两个静态属性的set方法: 3.将原来在静态属性上的@Value( ...

  10. mysql 查询正在执行的sql

    select * from information_schema.`PROCESSLIST` where info is not null; 或者 -- use information_schema; ...