我想知道为什么需要内存障碍,我读了一些关于这个Topic的文章
有人说这是因为cpu无序执行,而其他人说这是因为缓存一致性问题导致缓冲区存储和队列失效<那么,需要记忆障碍的真正原因是什么?cpu无序执行或缓存一致性问题?或者两者都有?cpu无序执行是否与缓存一致性有关?x86和arm之间有什么区别?
当ISA的内存排序规则弱于您的算法所需的语义时,您需要障碍来排序此核心/线程对全局可见一致缓存的访问。
缓存总是一致的,但这与一致性(在多个操作之间排序)是不同的。
您可以在按顺序排列的CPU上重新排序内存。更详细地说,如何加载-
相关:
另请参见https://preshing.com/20120710/memory-barriers-are-like-source-control-operations/和https://preshing.com/20120930/weak-vs-strong-memory-models了解更多基本信息。x86有一个“强”内存排序模型:程序顺序加上带有存储转发的存储缓冲区。C获取和发布是“免费”的,只有原子RMW和seq\u cst存储需要屏障。
ARM有一个“弱”内存排序模型:只有Cmemory_order_consume
(数据依赖排序)是“免费的”,获取和发布需要特殊指令(如ldar
/stlr
)或障碍。
当无序处理器遇到以下情况时 假设所有访问都将导致缓存未命中,处理器能否在请求$R1甚至0x1337之前请求内存控制器请求0x42的内容?如果是这样,假设访问$R1将导致异常(例如,分段错误),我们可以认为0x42是推测性加载的,对吗? 顺便说一下,当加载存储单元向内存控制器发送请求时,它可以在接收到对前一个的回答之前发送第二个请求吗? 我的问题没有特别针对任何架构。欢迎与任何主流架构相关的答案。
我正试图确切地理解什么是记忆障碍。根据我目前所知,使用内存屏障(例如:mfence)来防止指令从之前到之后和从之后到之前的重新排序。 这是正在使用的内存屏障的一个示例: 现在我的问题是:mfence指令是否只是一个指示CPU以何种顺序执行指令的标记?或者,它是CPU实际执行的指令,就像它执行其他指令一样(例如:)。
我试图理解Java的关键字,关于在具有CPU缓存的多线程程序中写入易失性原子变量。 我已经阅读了一些教程和Java语言规范,特别是关于“订购前发生”的第17.4.5节。我的理解是,当一个线程将一个新值写入一个可变变量时,更新后的值必须对读取该变量的其他线程可见。对我来说,这些语义可以通过以下两种方式之一实现: > 线程可以在CPU缓存中缓存易失性变量,但对缓存中变量的写入必须立即刷新到主内存。换句
1)谁能解释一下为什么显示的是31GB而不是60GB。2)还有助于为上述参数设置最佳值。
内存和性能配置不足是导致应用程序运行缓慢或崩溃的主要原因吗?
我正在评估Apache Ignite,以检查它是否符合我们公司的需要。到目前为止还好。现在我正试图了解near cache特性在一致性方面是如何工作的。 我的问题是:除了这个文档之外,还有其他文档解释它是如何工作的吗?特别是,我想知道对任何其他实例的任何后续读请求(在写请求之后)是否会获得更新的数据(没有最终的一致性)。 谢了!