一、物理机中的效率与一致性
1. 高速缓存(Cache)的引入
“让计算机并发执行若干个运算任务”与“更充分地利用计算机处理器的性能”之间的因果关系,看起来利索当然,实际上他们之间的关系并没有想象中那么简单,其中一个重要的复杂性的来源是绝大多数的运算任务都不可能只靠处理器“计算”就能完成。
处理器只要要与内存交互,如读取运算数据、存储计算结果等,这个IO操作就是很难消除的(无法仅靠寄存器来完成所有运算任务)。
由于计算机的存储设备与处理器的运算速度有着几个数量级的差距,所以现代计算机系统都不得不加入一层或多层读写速度尽可能接近处理器运算速度的高速缓存(Cache)来作为内存与处理器之间的缓冲:
将运算需要使用的数据复制到内存中,让运算能快速进行,当运算结束后再从缓存同步到内存之中,这样就无需等待缓慢的内存读写了。
2. 缓存一致性问题
在多路处理器系统中,每个处理器都有自己的高速缓存,而他们又共享同一主内存(Main Memory),这种系统称为共享内存多核系统。当多个处理器的运算任务都涉及同一块主内存区域时,将可能导致各自的缓存数据不一致。
为了解决缓存数据一致性的问题,需要各个处理器访问缓存时都遵循一些协议,在读写时要根据协议来操作。比如:MSI、MESI、MOSI等。
3.乱序执行优化
除了增加高速缓存之外,为了使处理器内部的运算单元能尽量被充分利用,处理器可能会对输入代码进行乱序执行(Out-Of-Order Execution)优化,处理器会在计算之后将乱序执行的结果重组,保证该结果与顺序执行的结果是一致的,但并不保证程序中各个语句计算的先后顺序与输入代码中的顺序一致。
与处理器的乱序执行优化类似,Java虚拟机的即使编译器中也有指令重排序优化。