【发布时间】:2009-02-05 17:30:50
【问题描述】:
机器字长(或更小)的写入是否序列化?只需一个本机操作码即可将寄存器内容复制到 RAM。
【问题讨论】:
标签: architecture memory synchronization cpu
机器字长(或更小)的写入是否序列化?只需一个本机操作码即可将寄存器内容复制到 RAM。
【问题讨论】:
标签: architecture memory synchronization cpu
将数据写入 RAM 是原子操作。如果两个 CPU 尝试同时写入同一位置,内存控制器将决定写入的某些顺序。当一个 CPU 正在写入内存时,另一个 CPU 将根据需要停止尽可能多的周期,直到第一次写入完成;然后它将覆盖其值。这就是所谓的race condition。
小于本机字大小的写入不是原子的——在这种情况下,CPU 必须将旧内存值读入寄存器,将新字节写入寄存器,然后将新值写回内存.
你永远不应该有依赖于此的代码——如果你有多个 CPU 试图同时写入同一个内存位置,那么你做错了什么。
另一个重要的考虑因素是cache coherency 问题。每个 CPU 都有自己的缓存。如果一个 CPU 将数据写入其缓存,则需要让其他 CPU 知道该数据值的更改才能读取它。
【讨论】:
没有什么可以阻止您在低级别上执行此操作。然而,RAM 写入是原子的,因此内存控制器将按顺序从内核执行 2 次看似相似的写入。
【讨论】:
两个 CPU 可以同时发出命令,但是 RAM 控制器不是必须单独处理它接收到的每个命令吗?所以,也许对 CPU 来说它是同时的,但是 RAM 控制器会决定先处理谁的命令。
【讨论】:
他们不应该这样做,因为如果写入不同的值,生成的 RAM 内容将是未指定的。
【讨论】:
与直接写入 RAM 相比,本机操作码不是更有可能写入 CPU 上的缓存吗?
【讨论】:
他们可以尝试,但硬件将是最终决定因素。
【讨论】: