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