CPU的乱序执行

每当上下班的高峰期,总是有少数人不顾社会公德,一窝蜂似的冲上公交车。在文明社会里面,讲究“有序排队,文明礼貌”,理应杜绝故意插队和无序拥挤。但是对CPU而言,指令的乱序执行是正常,不乱序才是有问题呢。这与我们的生活观念不符,令人难以接受,下面请听我把原因一一道来。

现在的CPU一般采用流水线来执行指令。一个指令的执行被分成:取指、译码、访存、执行、写回等若干个阶段。多条指令可以同时存在于流水线中,同时被执行。指令流水线并不是串行的,并不会因为一个耗时很长的指令在执行阶段呆很长时间,而导致后续的指令都卡在执行之前的阶段上。

相反,流水线是并行的,多个指令可以同时处于同一个阶段,只要CPU内部相应的处理部件未被占满即可。比如说CPU有一个加法器和一个除法器,那么一条加法指令和一条除法指令就可能同时处于执行阶段,而两条加法指令在执行阶段就只能串行工作。

相比于串行方式,流水线像这样并行的工作,效率是非常高的。可以体会下面的例子:

public class CPUDemo 
{
    static int mainmemory = 1;
    public static void main(String[] args)
    {
        int sum = mainmemory +1;
        int localmemory = 2;
    }
}

mainmemory变量是从主存中加载的,肯定不如localmemory赋值快,localmemory的赋值操作可是在寄存器中操作的,所以就发生了乱序:

int localmemory = 2;先执行完,然后再执行完int sum = mainmemory +1;

备注:本文从例子入手,仅仅是为了更形象的说明指令的乱序执行问题。至于底层到底是怎么执行的,执行过程中有哪些细节,本文未做考证,敬请注意。