且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

Memory barrier

更新时间:2022-09-27 15:19:19

 待续

Memory barrier,是一种屏障和一类指令,在执行这个屏障指令前后,CPU或者编译器在内存操作上强制一个约束序列。CPU使用性能优化器可以导致执行代码的无序。在单一线程执行中,重排序内存操作通常不会被注意。但是在并行编程或者设备驱动中会导致不可预料的行为。确切的排序约束是依赖于硬件的,并且有系统结构的内存模型所定义。一些结构提供多个屏障来强制不同的排序约束。内存约束通常使用在低级的机器码中,用在多个设备中操作内存的时候。这些代码包括在多处理器系统和硬件驱动开发中同步初始的锁数据结构。

 

当程序运行在单一CPU上。硬件执行必须的记录工作来保证程序按照程序员指定的序列顺序执行,因此memory barriers鄙视必须的。但是,当内存由多个设备共享的时候,比如多个CPU系统,或者无序访问可能影响程序的行为。比如第二个CPU可能看到内存由第一个CPU改变,其执行序列并不是程序规定的序列。

下面给出了一个具体的例子来说明无序执行怎样影响程序的行为。初始的,内存地址x和f的值都是0,当f的值是0的时候,程序在处理器1上循环,然后打印出x的值。处理器2上的程序把值42存入x,把1存入f。下面是伪代码片段,程序并行的在各个处理器上执行。

Processor #1:
loop:
load the value in location f, if it is 0 goto loop
print the value in location x
Processor #2:
 
store the value 42 into location x
store the value 1 into location f
 
你可能期望得到打印42。但是,如果处理器2的存储操作执行无序,很可能f先于x被赋值,因此打印的结果可能是0。对于大多数程序来说这种情况是不能被接受的,在处理器2的赋值f语句之前,插入memory barrier来保证对于其他处理器,x的值优先于f值的改变。

 

多线程编程通常使用由高级语言环境提供的的同步机制,比如java和.net,或者API比如POSIX线程或者Win32。初始的比如Mutex和Semaphores用来在并行线程执行的时候同步访问资源。这些通常都需要提供memory barriers来执行,来保证内存可视。在这种环境中,直接显示调用memory barriers通常都不是必须的。

每个API或者程序环境在并行情况下都有自己的高级内存模型,来定义内存的可视语义。尽管程序员通常不需要在高级开发环境中使用memory barriers,理解内存可视语义也是很重要的。

















本文转自cnn23711151CTO博客,原文链接: http://blog.51cto.com/cnn237111/524552,如需转载请自行联系原作者