【问题标题】:64 bits native types atomicy and memory bus?64位本机类型原子性和内存总线?
【发布时间】:2013-08-22 18:31:16
【问题描述】:

我在某些时候读过本机类型是原子的,只要它们不比内存总线宽并且对齐。我可能对此非常错误,但是即使对于 32 位 CPU (http://en.wikipedia.org/wiki/Front-side_bus),内存总线通常不是 64 位的吗?在哪种情况下,上面的语句意味着读取或写入或对齐的 64 位本机类型将是原子的,对吗?我查看了英特尔的文档,它说 x86 保证在 32 位及以下是原子的 - 但我想确保我正确理解内存总线宽度部分。

谢谢!

【问题讨论】:

  • 我认为你在问自己一个错误的问题。如果对特定整数类型的访问是原子的,您的编译器将知道这一点。现代编译器要么实现新的 C11 _Atomic,要么实现类似的东西作为对先前版本标准的扩展。只要您需要原子操作,就可以使用它们。

标签: c cpu cpu-architecture atomic


【解决方案1】:

内存总线的宽度与内存访问的原子性无关。您可以拥有一个 1 位内存总线,并且通过 64 次读取或写入保持总线,仍然可以进行原子 64 位内存访问。如果 CPU 和缓存之间的路径是 32 位并且无法锁定缓存,则您可以有 64 位总线,但不能有原子的 64 位内存访问。

【讨论】:

  • 是的。绝对不仅仅是编译器或 CPU 问题,而是架构/系统问题。
  • 我对 CPU 架构不是很熟悉,我只是想确保 64 位原生在具有 64 位宽总线的 32 位 CPU 上不是原子的。那么,什么能保证 32 位本机类型在 x86 上是原子的,为什么当总线可能是 64 位时它不能保证 64 字节的本机类型不是(与 x64 相反)?另外,“什么”可以让总线在 32 位 CPU 上进行 64 位读取原子操作?
  • 64 位本机在具有 64 位总线的 32 位 CPU 上可能是原子的,也可能不是原子的。您必须查看特定平台或 CPU 的文档。 32 位 x86 CPU 通常具有原子 64 位操作,例如 CMPXCHG8B。至于什么会保持总线,它取决于实现。在过去(最初的 Pentium),CPU 会断言一条实际的“LOCK”行。在更现代的平台上,缓存线被锁定在 L1 缓存中,这使得操作具有原子性,因为其他 CPU 在释放之前无法获取缓存线。
猜你喜欢
  • 1970-01-01
  • 2012-03-06
  • 2023-04-01
  • 2020-03-24
  • 2011-02-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多