此部分说明三个指令的具体区别(在指令流水线上说明),这三个指令主要目的在于确保程序在多处理器环境下的稳定性和一致性,避免由于指令乱序和内存操作重排引起的不可预测行为
一个简化的流水线,包含以下阶段:取指(IF)、译码(ID)、执行(EX)、内存访问(MEM)和写回(WB)
流程和流水线不做对应,请注意
DMB (Data Memory Barrier):
功能:确保在 DMB 之前的所有内存访问指令在之后的内存访问指令之前完成。
用途:主要用于确保在多处理器系统中数据的一致性。例如,在一个核心写入数据后,另一个核心可以读取到最新的数据。
流水线
在上面的示例中,DMB 确保在 T5 时刻 Load A 的内存访问完成后,Load B 的内存访问才开始。
流程
+-------------------+
| Operation A | (Memory Write)
+-------------------+
|
v
+-------------------+
| DMB |
+-------------------+
|
v
+-------------------+
| Operation B | (Memory Read)-------------------+
Operation A 的内存写入在 DMB 之前完成,Operation B 的内存读取在 DMB 之后开
DSB (Data Synchronization Barrier):
功能:确保在 DSB 之前的所有指令(不仅仅是内存访问指令)在之后的所有指令之前完成。
用途:用于确保在 DSB 之前的所有指令完全执行完毕后才继续后续指令的执行,常用于需要精确控制指令执行顺序的场景。
流水线
在上面的示例中,DSB 确保在 T6 时刻之前的所有指令(Load A 和 Load B)都完成后,Load C 才开始执行。
流程
+-------------------+
| Operation A | (Any instruction)
+-------------------+
|
v
+-------------------+
| DSB |
+-------------------+
|
v
+-------------------+
| Operation B | (Any instruction)
+-------------------+
Operation A 的所有操作在 DSB 之前完成,Operation B 的所有操作在 DSB 之后开始。
ISB (Instruction Synchronization Barrier):
功能:刷新处理器流水线,确保在 ISB 之前发出的所有指令都已被处理。ISB 之后的新指令会从指令缓存或内存中重新获取。
用途:多用于修改代码之后,确保后续执行的新代码。常见的场景包括修改指令缓存或分支预测行为后需要确保这些更改被处理。
流水线
ISB 确保在 T6 时刻之前的所有指令都被处理后,处理器流水线被刷新。之后的新指令(Load X)从缓存或内存中重新获取。
流程
+-------------------+
| Operation A | (Instruction fetch)
+-------------------+
|
v
+-------------------+
| ISB |
+-------------------+
|
v
+-------------------+
| Operation B | (New Instruction fetch)
+-------------------+
Operation A 的指令全部执行并且流水线清空,Operation B 的指令从新的缓存或内存中重新获取。