快速业务通道

内存屏障与JVM并发 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-15
约定,因为第一次写操作在第二次写操作 之前发生。

st.rel屏障是单向的——就像ld.acq一样。但是在第五行编译器设置了一个双 向内存屏障。mf指令,或者称为“内存栅栏”,是Itanium 2指令集中的完整栅栏 。笔者认为是多余的。

内存屏障与JVM并发(3)

时间:2011-09-04 infoq 崔康译

内存屏障是特定于硬件的

本文不想针对所有内存屏障做一综述。这将是一件不朽的功绩。但是,重要的 是认识到这些指令在不同的硬件体系中迥异。下面的指令是连续写操作在多处理 Intel Xeon硬件上编译的结果。本文后面的所有汇编指令除非特殊声明否则都出 自于Intel Xeon。

1 0x03f8340c: push  %ebp        ;...55   2 0x03f8340d: sub  $0x8,%esp     ;...81ec0800  0000   3 0x03f83413: mov  $0x14c,%edi    ;...bf4c0100 00   4 0x03f83418: movb  $0x1,-0x505a72f0(%edi) ;...c687108d  a5af01   5 0x03f8341f: mfence          ;...0faef0   6 0x03f83422: mov  $0x148,%ebp    ;...bd480100 00   7 0x03f83427: mov  $0x14d,%edx    ;...ba4d0100 00   8 0x03f8342c: movsbl -0x505a72f0(%edx),%ebx ;...0fbe9a10  8da5af   9 0x03f83433: test  %ebx,%ebx     ;...85db 10 0x03f83435: jne  0x03f83460     ;...7529 11 0x03f83437: movl  $0x1,-0x505a72f0(%ebp) ;...c785108d  a5af01 12 0x03f83441: movb  $0x0,-0x505a72f0(%edi) ;...c687108d  a5af00 13 0x03f83448: mfence          ;...0faef0 14 0x03f8344b: add  $0x8,%esp     ;...83c408 15 0x03f8344e: pop  %ebp        ;...5d

我们可以看到x86 Xeon在第11、12行执行两次volatile写操作。第二次写操作 后面紧跟着mfence操作——显式的双向内存屏障。

下面的连续写操作基于SPARC。

1 0xfb8ecc84: ldub [ %l1 + 0x155 ], %l3  ;...e60c6155   2 0xfb8ecc88: cmp %l3, 0        ;...80a4e000   3 0xfb8ecc8c: bne,pn  %icc, 0xfb8eccb0 ;...12400009   4 0xfb8ecc90: nop            ;...01000000   5 0xfb8ecc94: st %l0, [ %l1 + 0x150 ] ;...e0246150   6 0xfb8ecc98: clrb [ %l1 + 0x154 ]   ;...c02c6154   7 0xfb8ecc9c: membar #StoreLoad    ;...8143e002   8 0xfb8ecca0: sethi %hi(0xff3fc000), %l0 ;...213fcff0   9 0xfb8ecca4: ld [ %l0 ], %g0     ;...c0042000 10 0xfb8ecca8: ret            ;...81c7e008 11 0xfb8eccac: restore          ;...81e80000

我们看到在第五、六行存在两次volatile写操作。第二次写操作后面是一个 membar指令——显式的双向内存屏障。

x86和SPARC的指令流与Itanium的指令流存在一个重要区别。JVM在x86和SPARC 上通过内存屏障跟踪连续写操作,但是在两次写操作之间没有放置内存屏障。另 一方面,Itanium的指令流在两次写操作之间存在内存屏障。为何JVM在不同的硬 件架构之间表现不一?因为硬件架构都有自己的内存模型,每一个内存模型有一 套一致性保障。某些内存模型,如x86和SPARC等,拥有强大的一致性保障。另一 些内存模型,如Itanium、 PowerPC和Alpha,是一种弱保障。例如,x86和SPARC 不会重新排序连续写操作——也就没有必要放置内存屏障。Itanium、 PowerPC和 Alpha将重新排序连续写操作——因此JVM必须在两者之间放置内存屏障。JVM使用 内存屏障减少Java内存模型和

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号