有序性(Ordering)是指在什么情况下一个处理器上运行的一个线程所执行的 内存访问操作在另外一个处理器运行的其他线程看来是乱序的(Out of Order)。乱序是指内存访问操作的顺序看起来发生了变化。有序性是Java多线程编程的3大特性之一,下面我们就来通过一个生动的例子来简单论证Java多线程的有序性。
在计算机体系结构中,为了提高执行部件的处理速度,经常在部件中采用流水线技术。所谓流水线技术,是指将一个重复的时序过程,分解成若干个子过程,而每一个子过程都可有效地在其专用功能段上与其他子过程同时执行。
以 DLX 指令集结构为例,一条指令的执行简单说可以分为以下几个步骤:
每一个步骤都可能使用不同的硬件完成。
由上图所示,如果没有指令流水线,指令2 需要等待指令1 完全执行完成后执行。假设每一个步骤(子过程)需要花费 1 个 CPU 时钟周期,则指令2 需要等待 5 个时钟周期。而使用指令流水线后,指令2 只需等待 1 个时钟周期就可以开始执行。指令2 开始执行时,指令1 根本还没开始执行,仅仅完成了取指操作而已。这仅仅是 DLX 指令集结构的流水线,实际商用 CPU 的流水线级别甚至可以达到 10 级以上,性能提升可谓是非常明显。
由于流水线技术的引入,不得不面对流水线的三种类型的相关:结构相关、数据相关、控制相关。
一旦流水线中出现相关,指令在流失线中的执行就会出现问题,消除相关的最基本方法是让流水线中的某些指令暂停执行。一旦暂停,所有硬件设备都会进入一个停顿周期,直接影响是性能的下降。我们说的指令重排序就是在产生数据相关时替代流水线暂停的重要方法。指令重排序仅仅是减少流水线暂停技术的一种,在 CPU 设计中还有很多其他软硬件技术来防止流水线暂停。虽然指令重排序会导致有序性问题,但指令重排序对性能的提高有非常重大的意义。
提枪策马乘胜追击04-21 20:01
代码小兵92504-17 16:07
代码小兵98804-25 13:57
杨晶珍05-11 14:54