内存障碍:软件黑客的硬件视图 - 使队列无效

Memory barriers: A hardware view for software hackers - invalidate queues

尽管 Memory barriers: a hardware view for software hackers book is considered extremely old (by it's author, seems like Paul himself answered ) 我发现它是围绕内存排序建立心智模型的绝佳帮手。

有一点不懂:

让我们考虑具有内存屏障的页面:

第 4 步说明 "b=1" 已写入存储缓冲区,因为 "a=1" 尚未写入缓存。

我无法得到的是为什么在下一页:

在第 3 步 "b=1" 被写入缓存行,即使在 "a=1" 之后存在内存屏障并且 "a=1" 尚未写入缓存?按照上一页的推理 "b=1" 应该只在步骤 10 之后(或之内)写入缓存,当包含 "a=1" 的存储缓冲区被写入缓存时。

您发布的 pdf 与您问题中的屏幕截图不同,因此我推测旧版本不正确(或者至少不够精确)。

第 4.3 章。实际上以以下评论开始:

Let us suppose that CPUs queue invalidation requests, but respond to them immediately. This approach minimizes the cache-invalidation latency seen by CPUs doing stores, but can defeat memory barriers, as seen in the following example.

序列也与您发布的有点不同:

  1. CPU0执行a=1。相应的缓存行在CPU 0 的缓存中是只读的,因此CPU 0 将"a" 的新值放入它的存储缓冲区并发送一个"invalidate" 消息以便从 CPU 1 的缓存中刷新相应的缓存行。

  2. CPU 1执行while (b==0) continue;,但是包含"b"的缓存行不在其缓存中。因此,它会发送 "read" 消息。

  3. CPU 1 收到 CPU 0 的 "invalidate" 消息,将其排队,并立即响应它。

  4. CPU 0 收到来自 CPU 1 的响应,因此可以自由地通过上面第 4 行的 smp_mb(),移动 "a" 从其存储缓冲区到其缓存行。

我相信这是一个假设的场景,但是当你考虑到这一点时,明显有问题的部分是 CPU1 在实际使其缓存无效之前确认 "invalidate" 消息,这使得 CPU 0 人认为可以进行。