阻塞和非阻塞,同步和异步,并发和并行

阻塞和非阻塞

阻塞和非阻塞,是针对用户进程(线程)的转态来说的。

  • 阻塞意味着用户进程(线程)被挂起,即让出CPU时间片,一直等待内核把数据准备好。

  • 非阻塞意味着用户进程(线程)不会挂起,用户进程可以不断地主动去看数据是否准备好,仍可以占用CPU时间片执行其他工作。

阻塞IO和非阻塞IO,都是同步IO;都是用户进程(线程)从内核中把数据取走。

同步和异步

同步和异步,是针对指令的执行顺序来说的。

  • 同步意味着发起调用后,没有得到结果之前,就不返回,自然也不能执行其他指令。

  • 异步意味着调用发出后,调用方立刻返回,通过回调等措施拿到结果,这样调用方还可以执行其他指令。

同步和异步、阻塞和非阻塞,是针对不同主体而言的。

并发和并行

并发和并行是两个非常容易混淆的概念。它们都可以表示两个或多个任务一起执行,但是偏重点有点不同。
并发偏重于多个任务交替执行,而多个任务之间有可能还是串行的。
并发是逻辑上的同时发生(simultaneous),而并行是物理上的同时发生。然而并行的偏重点在于”同时执行”。

  • 并行(parallel):指在同一时刻,有多条指令在多个处理器上同时执行。就好像两个人各拿一把铁锨在挖坑,一小时后,每人一个大坑。所以无论从微观还是从宏观来看,二者都是一起执行的。

  • 并发(concurrency):指在同一时刻只能有一条指令执行,但多个进程指令被快速的轮换执行,使得在宏观上具有多个进程同时执行的效果,但在微观上并不是同时执行的,只是把时间分成若干段,使多个进程快速交替的执行。这就好像两个人用同一把铁锨,轮流挖坑,一小时后,两个人各挖一个小一点的坑,要想挖两个大一点得坑,一定会用两个小时。

严格意义上来说,并行的多个任务是真实的同时执行,而对于并发来说,这个过程只是交替的,一会运行任务一,一会儿又运行任务二,系统会不停地在两者间切换。但对于外部观察者来说,即使多个任务是串行并发的,也会造成是多个任务并行执行的错觉。