Memory barrier

简介:

 待续

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,如需转载请自行联系原作者





相关文章
|
6月前
PGA memory operation
PGA memory operation
72 1
|
6月前
|
安全 数据处理 C#
深入理解C#中的Span<T>和Memory<T>
【1月更文挑战第8天】本文旨在探讨C#中引入的两个重要类型:Span<T>和Memory<T>。它们为开发者提供了一种高效且安全的方式来处理内存中的数据。文章首先介绍这两个类型的基本概念和用途,接着深入分析它们的工作原理和适用场景,并通过代码示例展示如何在实际应用中使用它们。
fork Cannot allocate memory
本章节分享一下经常会遇到 cannot allocate memory的解决方法
fork Cannot allocate memory
|
监控 应用服务中间件 nginx
|
Java 数据库管理 关系型数据库