并发(Concurrence)和并行(parallel)是计算机中非常重要的概念。我们今天就来理解一下这两个概念。
Erlang 之父 Joe Armstrong用如下图来解释了并发与并行的区别:
并发就是多个队列使用同一台咖啡机,如上图,就是两个队列轮换着使用同一台咖啡机,最终每个人都能接到咖啡。说得书面一点就是,指在同一时刻只能有一条指令执行,但多个任务指令被快速的切换执行,由于切换得太快,我们人体感知不到在切换,使得在宏观上看起来是多个进程同时在执行,但是微观上看并不是同时执行的,只是把时间分成若干段,使得多个进程快速交替执行。
并行是每个队列都有一台咖啡机,最终每个人也是能够接到咖啡,但是效率更高,因为同一时刻可以有两个人在接咖啡。说得书面一点就是,指在同一时刻,有多条指令在多个处理器上同时执行,所以无论从微观上看还是宏观上看,二者都是一起执行的。
实际上,如果系统重只有一个单核心的CPU,而现在使用多线程或者多线程任务,那么真实环境中这些任务是不可能真实并行的,毕竟一个CPU一次只能执行一条指令,这种情况下多线程或者多条线程任务就是并发的,而不是并行,操作系统会不停的切换任务。真正的并发也只能够出现在拥有多个CPU(或者多核心CPU)的系统中。