【问题标题】:why can MemoryBarrier be implemented as a call to xchg?为什么 MemoryBarrier 可以实现为对 xchg 的调用?
【发布时间】:2013-10-29 08:10:01
【问题描述】:

在 msdn http://msdn.microsoft.com/en-us/library/windows/desktop/ms684208(v=vs.85).aspx 上,MemoryBarrier 被实现为对 xchg 的调用。

// x86

FORCEINLINE
VOID
MemoryBarrier (
    VOID
    )
{
    LONG Barrier;
    __asm {
        xchg Barrier, eax
    }
}

我在“软件开发人员手册”中找不到一些资料。 请告诉我原因。

【问题讨论】:

  • xchg 带有一个内存操作数有一个隐含的lock。锁定指令是栅栏。

标签: windows x86 msdn memory-barriers


【解决方案1】:

这里发生了两件事:

  1. 给编译器一个不透明的块以插入到输出指令流中。由于它不知道块内访问了哪些数据,因此它无法重新排序围绕它的其他语句。

  2. xchg 指令执行原子读取-修改-写入操作,这需要在内存总线上进行排序,因此 CPU 会强制执行内存屏障。

【讨论】:

    【解决方案2】:

    来自 Intel 64 和 IA-32 架构软件开发人员手册,第 3 卷:“系统编程指南”

    8.2.5 “加强或削弱内存排序模型”

    多处理器系统中的同步机制可能取决于 基于强大的内存排序模型。在这里,程序可以使用锁定 指令,例如 XCHG 指令或 LOCK 前缀,以确保 对内存执行读-修改-写操作 原子地。锁定操作通常像 I/O 操作一样操作 在那个他们等待所有先前的指令完成并等待 所有缓冲的写入都排入内存(请参阅第 8.1.2 节,“总线 锁定”)。

    从 8.1.2 开始:

    锁定操作相对于所有其他内存是原子的 操作和所有外部可见的事件。 仅取指令 并且页表访问可以传递锁定指令。锁定 指令可用于同步一个处理器写入的数据 并由另一个处理器读取。

    对于 P6 系列处理器,锁定操作序列化所有 未完成的加载和存储操作(即等待它们 完成)。此规则也适用于 Pentium 4 和 Intel Xeon 处理器,但有一个例外。加载弱引用的操作 有序内存类型(如 WC 内存类型)可能不是 序列化。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-09-14
      • 2011-01-09
      • 1970-01-01
      • 1970-01-01
      • 2014-04-12
      • 2017-06-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多