举例来说:程序员做蛋糕,可以分为以下几个线程:添加水,添加面粉,混合原料。添加水和添加面粉可以异步,因为二者没有先后顺序。添加水和混合原料,添加面粉和混合原料必须同步(这里假定必须水和面粉添加好了,才能混合原料)。
假设只有程序员一个人,一会添加水,一会添加面粉,会降低效率(频繁地切换上下文),最好的做法是把水添加好了,再添加面粉,但是这不符合实际情况。程序员不能同时添加水和添加面粉,增加一个人可以显著提高效率。也就是说,对于异步的情况,可以增加CPU提高执行速度。但是对于同步的情况,增加CPU不起作用,因为有再多的CPU的也没用,必须等待前一个步骤完成。
可以异步的情况:两个步骤没有先后顺序,可以随时的切换(单个CPU),或者同时进行(多个CPU)。
必须同步的情况:两个步骤有先后顺序,必须前一个步骤完成,才能进行下一个步骤。
如果要想通过增加CPU提高执行速度,必须把一个任务分解成互不干扰的步骤。Google的MapReduce本质上就是这样。
可以异步的情况下,如果有多个CPU,采用异步当然提高效率。但是如果只有一个CPU,采用异步会降低效率,因为频繁切换上下文耗资源,但是为什么还采用异步呢?
举例来说,我想一边打游戏一边听歌,当然不能忍受游戏打完了,才能听歌。那么一个CPU必须在游戏程序和播放歌程序之间不停的切换,由于切换的时间非常短,用户实际上感觉不到切换。事实上,一个CPU在任何时刻只能做一件事。