为什么会有LoadStore指令?

3
我正在学习JSR-133菜谱,页面链接为JSR-133,在“分类”部分,作者给出了一个关于内存屏障的例子。以下是代码:

code

我不理解为什么在“load u”和“load b”之间有一个“LoadStore”。请问有人能帮帮我吗?谢谢。

这不是一条指令。这里的指令是loadsfore - user207421
2个回答

1
为什么在“load u”和“load b”之间有一个“LoadStore”? 实际上,这是在“load u”(易失性加载)和最后的“store a”(普通存储)之间需要的屏障。

但是在“load u”和“store a”之间有一个“load b”。我认为内存屏障被插入到了相邻指令之间。 - aworker
1
不,内存屏障会影响它之前和之后的所有适当类型指令。JVM需要屏障来表现出这种行为。从程序员的角度来看,考虑涉及相邻的易失性变量和普通变量访问的Java代码(而不是字节码)。但是,当给定的代码被编译并转换为字节码(低级别)时,对给定变量的访问可能不再相邻。因此,如果没有屏障的“全局”行为,它们对程序员来说将是无用的。 - Tsyvarev

0

JSR-133编译器编写指南中的混淆矩阵似乎呈现了实现volatile语义所需的障碍的优化视图。

volatile语义基本上是针对非易失性访问的释放/获取 + 针对易失性访问的总顺序。一般来说,加载-获取需要发出LoadLoad + LoadStore屏障,而存储-释放需要发出LoadStore + StoreStore屏障。为了保留一对volatile访问的总顺序,可以发出完整的栅栏。

load u 后跟着 load bstore a 是一个很好的展示 volatile 语义工作方式的例子。请记住,相对于非 volatile 访问,volatile 加载本质上具有获取语义。这意味着 load u 可能不会与任何后续访问重新排序,因此会发出 LoadLoad 屏障和 LoadStore 屏障。如果没有 LoadStorestore a 可能会在 load u 之前重新排序,从而破坏 volatile 的语义。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接