【问题标题】:Which ARM memory barrier guarantees that one of two threads will observe what the other thread wrote?哪个 ARM 内存屏障保证两个线程之一将观察另一个线程所写的内容?
【发布时间】:2020-02-25 05:23:26
【问题描述】:

线程 A 和 B 正在同时执行。哪些 ARMv8-A 内存屏障类型(如 DMB、DSB)足以满足后置条件,为什么?

Initially x1 = 0, x2 = 0


Thread A         |   Thread B
----------------------------------
x1 = 1           |   x2 = 1
barrier          |   barrier
y1 = x2          |   y2 = x1


Postcondition: (y1 == 1) || (y2 == 1)

我查看了ARMv8-A Architecture Reference Manual memory model definition of DMB and DSB,但无法推断为什么即使使用 DSB 内存屏障,后置条件也会成立。我认为架构参考手册中的关键定义是:

DMB 指令确保执行 DMB 的 PE 对所有受影响的内存访问,这些访问按程序顺序出现在 DMB 之前,以及来自不同 PE [...] 的那些在 DMB 之前被 PE 观察到的内存访问被执行,被每个 PE 观察 [...] 在 DMB 之后按程序顺序出现的任何受影响的内存访问被那个 PE 观察。

当满足以下所有条件时,PE [...] 执行的 DSB 完成:

  • 在 DSB 之前按程序顺序出现的所需访问类型的所有显式内存访问对于所需共享域中的观察者集都是完整的。

  • [...]

此外,在 DSB 指令之后出现在程序顺序中的任何指令都不能改变系统的任何状态或执行其功能的任何部分,除非 [...]

【问题讨论】:

  • 我会用 C/C++ 模型编写它,然后使用 recommended translation;它说“SeqCst Fence:dmb ish
  • 同核还是不同核?你看过 strex/ldrex 了吗?

标签: multithreading concurrency arm memory-barriers memory-visibility


【解决方案1】:

Unix smurfARM memory barriers 上写了一个系列。 DSBDMB 的超集,换句话说,DSB 的限制性更强。 DMB 足以确保在使用普通内存更新y1y2 之前完成对x1x2 的写入。即,在您的示例中,它足以替代 barrier 在大多数 ARM 系统上,DSB 也可以工作。


操作系统可以在 MMU 表中使用不同的属性,这可能会影响您的结果。例如,使用图形 RAM 或某些网络设备缓冲区作为 x1x2 的后备存储,可能不需要发出 dmbdmb 可能需要不同的参数,因为这些类型的内存可能放在不同的域。

事实上,操作系统可能完全颠覆这些机制。对于大多数用例来说,这不是一个因素,我只是说它是完整的。也有可能有 AMP(非对称多处理器)系统,但这是行不通的。例如,如果您有一个带有 ARMv8 和 Cortex-M 的系统。

参考:

【讨论】:

  • ldrexstrex 也可以工作。 DMB最轻的 版本,如果有的话,它们都应该。
猜你喜欢
  • 2014-05-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多