JAVA内存模型要点解析.ppt

  1. 1、本文档共31页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
重排序(为什么要重排序) 背景:CPU 的主频越来越高,与 cache 的交互次数也越来越多。当 CPU 的计算速度远远超过访问 cache 时,会产生 cache wait ,过多的 cache ?wait 就会造成性能瓶颈 解决方案:将cache分片,即将一块 cache 划分成互不关联地多个 slots ( 逻辑存储单元,又名 Memory Bank 或 Cache Bank) , CPU 可以自行选择在多个 idle bank 中进行存取。这种 SMP 的设计,显著提高了 CPU 的并行处理能力,也回避了 cache 访问瓶颈。 重排序的目的是为了性能 举例:a=1;b=2; 理想情况下:cpu0---写入1----bank0;A cpu0---写入2----bank1; B 如果bank0状态为busy, 则A过程需要等待 如果进行重排序,则直接可以先执行B过程。 重排序(数据依赖性) 数据依赖性:如果两个操作访问同一个变量,且这两个操作中有一个为写操作,此时这两个操作之间就存在数据依赖性 分为下面三种情况: 上面三种情况,只要重排序两个操作的执行顺序,程序的执行结果将会被改变。 所以有数据依赖性的语句不能进行重排序 重排序(as-if-serial) 语义:不管怎么重排序(编译器和处理器为了提高并行度),(单线程)程 序的执行结果不会被改变 编译器和处理器不会对存在数据依赖关系的操作做重排序,因为这种重排序会改变执行结果。但是,如果操作之间不存在数据依赖关系,这些操作可能被编译器和处理器重排序。为了具体说明,请看下面计算圆面积的代码示例: 执行的顺序只可能如下: (A与B没有依赖关系) A-B-C B-A-C as-if-serial语义把单线程程序保护了起来,遵守as-if-serial语义的编译器,写单线程的程序员有一个幻觉:单线程程序是按程序写的顺序来执行的。 double pi = 3.14; //A double r = 1.0; //B double area = pi * r * r; //C 重排序(happen before 规则) 语义:如果A先发生于B,那么A所做的所有改变都能被B看到 遵循的规则 程序顺序规则:一个线程中的每个操作,happens- before 于该线程中的任意后续操作。 监视器锁规则:对一个监视器锁的解锁,happens- before 于随后对这个监视器锁的加锁。 volatile变量规则:对一个volatile域的写,happens- before 于任意后续对这个volatile域的读。 传递性:如果A happens- before B,且B happens- before C,那么A happens- before C。 重排序对多线程的影响 class ReorderExample { int a = 0; boolean flag = false; public void writer() { a = 1; //1 flag = true; //2 } public void reader() { if (flag) { //3 int i = a * a; //4 …… } } } flag为标志位,表示a有没有被写入,当A线程执行writer方法,B线程执行reader方法,线程B在执行4操作时候,能否看到线程A对a的写入操作? 答案是不一定的 重排序对多线程的影响 由于操作1和操作2没有数据依赖关系,编译器和处理器可以对这两个操作重排序;当操作1和操作2重排序时,可能会产生什么效果?请看下面的程序执行时序图: 重排序对多线程的影响 操作3和操作4也没有数据依赖关系,但他们有控制依赖关系, 为此,编译器和处理器会采用猜测(Speculation)执行来克服控制相关性对并行度的影响。以处理器的猜测执行为例,执行线程B的处理器可以提前读 取并计算a*a,然后把计算结果临时保存到一个名为重排序缓冲(reorder buffer ROB)的硬件缓存中。当接下来操作3的条件判断为真时,就把该计算结果写入变量i中。 缓存一致性 缓存一致性(cache coherency) 神马是:它是一种管理多处理器系统的高速存储结构,其可以保证数据在高速缓存区到内存的传输中不会丢失或者重复 举例:如果有一个处理器有一个更新了的变量位于其缓存中,但还没有被写入主内存,这样别的处理器可能会看不到这个更新的值 解决

文档评论(0)

南非的朋友 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档