内存障碍:软件黑客的硬件视图 - 使队列无效
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.
序列也与您发布的有点不同:
CPU0执行a=1
。相应的缓存行在CPU 0 的缓存中是只读的,因此CPU 0 将"a" 的新值放入它的存储缓冲区并发送一个"invalidate" 消息以便从 CPU 1 的缓存中刷新相应的缓存行。
CPU 1执行while (b==0) continue;
,但是包含"b"的缓存行不在其缓存中。因此,它会发送 "read" 消息。
CPU 1 收到 CPU 0 的 "invalidate" 消息,将其排队,并立即响应它。
CPU 0 收到来自 CPU 1 的响应,因此可以自由地通过上面第 4 行的 smp_mb()
,移动 "a" 从其存储缓冲区到其缓存行。
我相信这是一个假设的场景,但是当你考虑到这一点时,明显有问题的部分是 CPU1 在实际使其缓存无效之前确认 "invalidate" 消息,这使得 CPU 0 人认为可以进行。
尽管 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.
序列也与您发布的有点不同:
CPU0执行
a=1
。相应的缓存行在CPU 0 的缓存中是只读的,因此CPU 0 将"a" 的新值放入它的存储缓冲区并发送一个"invalidate" 消息以便从 CPU 1 的缓存中刷新相应的缓存行。CPU 1执行
while (b==0) continue;
,但是包含"b"的缓存行不在其缓存中。因此,它会发送 "read" 消息。CPU 1 收到 CPU 0 的 "invalidate" 消息,将其排队,并立即响应它。
CPU 0 收到来自 CPU 1 的响应,因此可以自由地通过上面第 4 行的
smp_mb()
,移动 "a" 从其存储缓冲区到其缓存行。
我相信这是一个假设的场景,但是当你考虑到这一点时,明显有问题的部分是 CPU1 在实际使其缓存无效之前确认 "invalidate" 消息,这使得 CPU 0 人认为可以进行。