我最近一直在阅读内存模型,我对它的工作原理有点困惑。
引用http://cis.poly.edu/muller/CS623/weakmemory.htm
如果处理器写入一个新的 X 然后写入一个新的 Y,所有其他随后执行读取 Y 然后读取 X 的处理器将访问新 Y 和新 X、旧 Y 和新 X 或旧 X 和旧Y:但是没有处理器会访问新的 Y 和旧的 X。这种强排序假设曾经是合理的。然而,当前的计算机制造商建议程序员不要依赖内存排序。这是因为较新的内存管理系统尝试重新排序内存访问以进行优化。允许对内存请求重新排序的系统称为弱排序内存系统(模型)。要检查如何使用重新排序来提高性能,请考虑以下汇编代码 [2]。
Load reg1, A // register1 = contents of memory A
Load reg2, B // register2 = contents of memory B
ADD reg3, reg1, reg2 // register3 = register1 + register2
Store reg3, C // contents of memory C = contents of register3
如果我们假设位置 B 当前在缓存中并且位置 A 没有缓存,那么加载 A 将比 B 花费更长的时间。CPU 可以从其缓存中获取 B,而不是等待 A,隐藏 B 的延迟:因此 CPU 可以执行A 可用时立即添加。通过放宽执行的强(顺序)内存模型(即,A 必须首先加载,然后是 B),可以获得更高的性能——但重新排序可能对软件不透明。考虑下面的代码片段,它是可用于实现自旋锁信号量的代码的一部分 [2]。
我的问题是,较弱的内存模型怎么可能导致处理器可以访问新 Y 和旧 X 的情况。它不是写入同一个内存(ram)还是工作方式不同?我假设如果一个进程修改了一个变量,然后另一个进程读取它,它会读取最新的值。
我不确定的另一件事是哪个组件允许内存访问重新排序,我现在的假设是允许编译器重新排序指令。但是 CPU 也可以重新排序它们吗?
谢谢