zoukankan      html  css  js  c++  java
  • Memory barrier,

    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 == 0);
     // Memory fence required here
     print x;

     Processor #2:

     x = 42;
     // Memory fence required here
     f = 1;
    人们可能会期望print语句总是打印数字“42”;然而,如果处理器#2的存储操作被无序执行,那么f就有可能在x之前被更新,而print语句因此可能会打印“0”。
    类似地,处理器#1的加载操作可能会被无序执行,并且在检查f之前可以读取x,因此print语句可能再次打印出一个意外的值。对于大多数程序来说,这两种情况都是可以接受的。
    可以在处理器#2分配给f之前插入内存屏障,以确保在f值变化时或之前,其他处理器都可以看到x的新值。另一个可以插入到处理器#1对x的访问之前,以确保在看到f值的变化之前,不读取x的值。
  • 相关阅读:
    关于如何正确地在android项目中添加第三方jar包
    如何在asp.net页面使用css和js
    Prolog 外部不能有 DOCTYPE 声明。处理资源 'http://192.168.115.152:8082/api/EmpApi.aspx' 时出错。第 3 行,位置: 11
    怎样在iis中发布asp.net网站
    WInform 创建一个简单的WPF应用
    细说WPF数据绑定
    WPF控件模板
    DC画线
    第一部分 Mysql的基础
    链表○⇢习题集
  • 原文地址:https://www.cnblogs.com/qiyuexin/p/8862608.html
Copyright © 2011-2022 走看看