我碰巧看到这样的帖子。是这样介绍的:禁止编译器优化前提下:x86的每个核心都实现了Sequential consistency,保证指令按程序顺序发射到ROB,并行乱序执行,但最终会被顺序提交,所以无需考虑指令乱序带来的问题。且x86的Store Buffer是FIFO队列设计,且x86不存在失效队列结构,所以对于x86架构的处理器,仅考虑使用写屏障将Store Buffer中数据及时刷新到Cache即可。
而ARM架构的绝大部分处理器没有实现Sequential consistency,除了控制、地址、数据等前后依赖相关的指令不会被重排序之外,其他指令可能会被CPU优化后乱序发射并乱序提交。而且ARM的Store Buffer是非FIFO的,这使得数据刷新到Cache不是按序的。同时几乎ARM架构的处理器都存在Invalidate Queues结构,所以ARM处理器上的程序是需要程序员灵活使用内存屏障的。
为了能够同时解决像x86和ARM等处理器带来的数据问题,Java早先在硬件基础上抽象出四种传统的内存屏障,这些屏障的作用不仅体现在将Store Buffer中的数据刷新到Cache和将Invalidate Queues中的失效消息处理,还会禁止ARM架构的处理器对前后指令进行重排序,最终使得指令按序发射和提交。
想问一下各路大佬,这种理解正确吗?
而ARM架构的绝大部分处理器没有实现Sequential consistency,除了控制、地址、数据等前后依赖相关的指令不会被重排序之外,其他指令可能会被CPU优化后乱序发射并乱序提交。而且ARM的Store Buffer是非FIFO的,这使得数据刷新到Cache不是按序的。同时几乎ARM架构的处理器都存在Invalidate Queues结构,所以ARM处理器上的程序是需要程序员灵活使用内存屏障的。
为了能够同时解决像x86和ARM等处理器带来的数据问题,Java早先在硬件基础上抽象出四种传统的内存屏障,这些屏障的作用不仅体现在将Store Buffer中的数据刷新到Cache和将Invalidate Queues中的失效消息处理,还会禁止ARM架构的处理器对前后指令进行重排序,最终使得指令按序发射和提交。
想问一下各路大佬,这种理解正确吗?