了解内存模型

时间:2011-01-04 14:08:51

标签: cpu-architecture cpu-registers memory-model

我最近一直在阅读关于内存模型的内容,我对这是如何工作感到困惑。

引用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是否也可以对它们进行重新排序?

由于

2 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:0)

编译器和CPU都可以重新排序指令。见Memory ordering