在程序加载到内存并执行的时候(进程),操做系统会经过让它和其余进程分时段占用CPU(CPU slices)让它产生本身独占CPU的假象(同时经过虚拟内存让它产生独占内存的假象)。在CPU在执行一个进程的指令时,被执行的许多指令链接起来(也能够理解为程序计数器PC的变化)就构成了“逻辑控制流”。vim
逻辑控制流的概念也不局限于进程,它在异常处理程序、线程、Java进程中均有体现。而“并发(concurrency)”和”并行(parallel)“都是对逻辑控制流而言的。并发
当两个逻辑控制流交替执行的时候,咱们就称它们是”并发(concurrency)“的。更确切的说,对于逻辑控制流A、B,若是B被执行晚于A被执行的开始且早于A被执行的结束,那么A和B就是并发的。例以下图:google
其中A和B是并发的,由于B的执行晚于A的开始且早于A的结束。可是B和C就不是并发的,由于C的执行并无早于B的结束。同理A和C是并发的。spa
注意到并发和cpu的个数或者计算机的个数是没有关系的,只要两个逻辑流知足上面的关系咱们就称它们并发。操作系统
若是两个逻辑控制流同时(一个cpu时段内)在不一样的cpu(多核)或者计算机上被执行,咱们就称其为并行。例以下图:线程
其中A和C、B和D之间就是并行执行的。code
注意到并行要求具备多个处理核心。blog
另外,我在网上看到一组颇有意思的漫画,讲解了并发和并行的区别,分享一下(图片来自https://code.google.com/archive/p/rspace/source/concur/source):进程
假设一只老鼠正在烧书,其中书就表明要被执行的指令,火炉表明cpu,老鼠把书一本本运送并烧掉的过程就构成了逻辑控制流。图片
如今有A、B两只老鼠(两个逻辑控制流)在烧书,例以下面这个图,因为只有一个火炉,A老鼠烧书的时候,B就要等着(保存上下文),A烧一下子后再轮到B烧(上下文切换),即他们烧书是交替进行的,咱们就说他们在并发。(多个火炉知足这样的交替关系咱们也能够说他们在并发):
当两只老鼠烧书同时进行时,咱们就说它们是并行的,例以下面这个例子,因为有两个火炉(多核),烧书自己能够同时发生:
参考: