5

我最近一直在阅读内存模型,我对它的工作原理有点困惑。

引用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 也可以重新排序它们吗?

谢谢

4

2 回答 2

4

您必须记住缓存位于 CPU 和内存之间。当软件写入一个值时,它肯定会落在缓存中,但如果在缓存将其复制到 RAM 之前再次写入该值(想想循环变量和局部变量),它可能永远不会进入主内存。整个讨论围绕着数据实际放置在 RAM 中或从 RAM 中读取的不同模型展开。在内核中这并不重要,因为他们将使用来自缓存或 RAM 的最后一个值写入天气。

于 2011-01-04T14:31:10.187 回答
0

编译器和 CPU 都可以重新排序指令。请参阅内存排序

于 2011-01-04T14:23:05.057 回答