【发布时间】:2017-08-01 11:47:51
【问题描述】:
根据我所读到的,CPU 可以重新排序指令的执行,而内存屏障防止指令从前到后以及从后到前重新排序。
但有些事情我不确定。假设我有以下说明:
store x
store y
假设 CPU 决定在 store x 之前执行 store y。
CPU 是如何做到这一点的,它会完全忽略store x 并首先执行store y 吗?还是会出现以下情况?:
-
store x被执行,但并没有立即完成(它变成 待定)。 -
store y被执行,立即完成。 - 待处理的
store x已完成。
所以基本上,这给出了指令被乱序执行的“错觉”,即使它们没有,它们只是乱序完成。
我问这个问题是为了了解内存屏障的工作原理。
例如说我有以下说明:
store x
mfence
store y
现在当 CPU 执行这些指令时,会发生以下情况吗?:
-
store x被执行,但并没有立即完成(它变成 待定)。 -
mfence被执行,现在因为这条指令是一个内存 屏障,CPU 将确保所有挂起的操作之前 它 (store x) 将在继续执行指令之前完成。 -
store y被执行。
【问题讨论】:
-
乱序的唯一意义就是实际上是乱序执行,错觉是它们按顺序执行。请注意,有一些规则,其中之一是:写入内存不会与其他写入重新排序(假设 WB 并且没有像显式非时间这样的花哨的东西)
-
所有外围设备都需要在写入前进行设置才能说 go/enable/run 等,乱序写入将是一场灾难。
-
认为 a=b+c; d=e+f; h=5; g=a+d。 d= 可能发生在 a= 之前,一切都会好起来的,或者可能移动 h=5。想一想,如果某个寄存器很忙,并且还有其他一些不忙的东西,可以在不改变程序功能的情况下插入,然后运行它。
-
不了解 x86,但在 arm 上,您使用内存屏障进行诸如刷新写入缓冲区或使缓存无效之类的事情,然后让其他任何人进行任何内存操作使缓存无效并基本上完成任何未决的内存事务。数据屏障基本上会说完成飞行中或队列中的任何数据事务。并且指令障碍会说在继续之前完成管道。
-
搜索开源项目(如 linux),看看他们在哪些地方使用了内存屏障,在哪些地方没有使用...它应该开始阐明您的困惑。
标签: assembly x86 memory-barriers