我最近一直在阅读关于内存模型的内容,我对这是如何工作感到困惑。
引用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.更长。而不是等待 A,CPU可以从缓存中获取B, 隐藏B的延迟:因此CPU可以 一旦A出现就执行添加 可用。通过放松强者 (顺序)执行的内存模型 (即A必须首先加载,然后加载 B),性能更好 可能----但重新排序可能不是 对软件透明。考虑一下 下面的代码片段,它是的一部分 可用于实现的代码 spinlock信号量[2]。
我的问题是,如果使用较弱的内存模型可能会导致处理器可以访问新的Y和旧的X.它是不是写入相同的内存(ram)或者它是否有效不同?我假设如果一个进程修改了一个变量而另一个进程在此之后读取它,它会读取最新的值。
我不确定的另一件事是哪个组件允许内存访问重新排序,我现在的假设是允许编译器重新排序指令。但CPU是否也可以对它们进行重新排序?
由于
答案 0 :(得分:4)
您必须记住缓存位于CPU和内存之间。什么时候软件写一个值肯定落在缓存中,但如果在缓存将其复制到RAM之前再次写入值(想想循环变量和本地),它可能永远不会进入主存储器。整个讨论围绕着数据实际放入RAM或从RAM读取的不同模型。在核心中它并不重要,因为它们将使用最后一个写入天气的值来自缓存或RAM。
答案 1 :(得分:0)
编译器和CPU都可以重新排序指令。见Memory ordering