【问题标题】:Understanding Memory Models了解内存模型
【发布时间】:2011-06-03 10:19:08
【问题描述】:

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

引用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),更大的性能是 可能----但可能无法重新排序 对软件透明。考虑 下面的代码片段,它是 可用于实现的代码 自旋锁信号量 [2]。

我的问题是,较弱的内存模型怎么可能导致处理器可以访问新 Y 和旧 X 的情况。它不是写入同一个内存 (ram) 还是可以工作不同?我假设如果一个进程修改了一个变量,然后另一个进程读取它,它会读取最新的值。

我不确定的另一件事是哪个组件允许内存访问重新排序,我现在的假设是允许编译器重新排序指令。但是 CPU 也可以重新排序吗?

谢谢

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 2020-12-13
        • 2011-02-25
        • 1970-01-01
        • 2013-06-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-04-04
        • 1970-01-01
        相关资源
        最近更新 更多