java内存模型与线程(一)

本文探讨了现代计算机系统中因处理器与内存速度差异导致的缓存一致性问题,介绍了多种解决该问题的协议,并讨论了处理器优化及Java虚拟机如何处理这些问题。

硬件的效率与一致性:
      物理计算机中的并发问题:让“计算机并发的执行若干个运算任务”与“更充分的利用计算机的处理器效能”的因果关系看起来顺理成章。
      实际上其中一个重要的复杂性来源是绝大多数的运算任务都不可能只靠处理器“计算”就能完成,处理器至少要与内存交互,如读取运算数据、存储运算结果,这个IO操作是很难消除的(无法紧靠寄存器来完成所有的运算任务)。由于计算机的存储设备与处理器的运算速度有几个数量级的差距。所有现代计算机系统加入了一层读写速度尽可能接近处理器运算速度的高速缓存来作为内存和处理器之间的缓冲:将运算需要使用到的数据复制到缓存中,让运算能快速运行,当运算结束后再从缓存同步到内存中,只要处理器就无须等待慢 的内存读写了。
      基于高速缓存的存储交互很好的解决了处理器与内存的速度矛盾,但是也为计算机系统带来了更高的复杂度,因为他引入了一个新问题:缓存一致性。
      在多处理器系统中,每个处理器都有自己的高速缓存,而他们有共享同一主内存。当多处理器的运算任务涉及到同一块的主内存区域时,将可能导致各自的缓存数据不一致。为了解决一致性的问题,需要各个处理器访问缓存时都遵循一些协议,这类协议有MSI、MESI、MOSI、Synapes、firefly以及Dragon Protocol等。
      下面讲到的“内存模型”可以理解为是在特定的操作协议下,对特定的内存或者高速缓存进行读写访问的过程抽象。
不同架构的物理机器可以拥有不一样的内存模型,而java虚拟机也有自己的内存模型,而java的内存访问操作和硬件的缓存访问操作具有可比性。


       除了增加高速缓存之外,为了使得处理器内部的运算单元尽可能的被充分利用,处理器可能会对输入的代码进行乱序执行优化,处理器会在计算之后将乱序执行的结果重组保证该结果与顺序执行的结果一直,但不保证程序中各个语句计算的先后顺序与输入的代码的顺序一致。
      与处理器的乱序执行优化类似,java虚拟机的即时编译器中也有类似的指令重排序优化。

转载于:https://my.oschina.net/u/1581079/blog/648254

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值