并发和并行

概念

并发(concurrency):指在同一时刻只能有一条指令执行,但多个进程指令被快速的轮换执行,使得在宏观上具有多个进程同时执行的效果,但在微观上并不是同时执行的,只是把时间分成若干端,使多个进程快速交替的执行

如上图所示,并发就是只有一个CPU资源,程序(或线程)之间要竞争得到执行机会。图中的第一个阶段,在A执行的过程中,B、C不会执行,因为这段时间内这个CPU资源被A竞争到了,同理,第二阶段只有B在执行,第三阶段只有C在执行。其实,并发过程中,A、B、C并不是同事进行的(微观角度),但又是同时进行的(宏观角度)

并行(parallellism):指在同一时刻,有多条指令在多个处理器上同时执行

如图所示,在同一时刻,ABC都是同时执行(微观、宏观)

总结

通过多线程实现并发,并行:

  • java中的Thread类定义了多线程,通过多线程可以实现并发或并行。
  • 在CPU比较繁忙,资源不足的时候(开启了很多进程),操作系统只为一个含有多线程的进程分配仅有的CPU资源,这些线程就会为自己尽量多抢时间片,这就是通过多线程实现并发,线程之间会竞争CPU资源争取执行机会。
  • 在CPU资源比较充足的时候,一个进程内的多线程,可以被分配到不同的CPU资源,这就是通过多线程实现并行。
  • 至于多线程实现的是并发还是并行?上面所说,所写多线程可能被分配到一个CPU内核中执行,也可能被分配到不同CPU执行,分配过程是操作系统所为,不可人为控制。所以,如果有人问我我所写的多线程是并发还是并行的?我会说,都有可能。
  • 不管并发还是并行,都提高了程序对CPU资源的利用率,最大限度地利用CPU资源。

通俗理解

并发:多线程运行在同一个CPU内,CPU不停做上下文切换执行任务,单位时间内只有一个线程在运行;

并行:多线程运行在多核心CPU内,同时执行任务;

你吃饭吃到一半,电话来了,你一直到吃完了以后才去接,这就说明你不支持并发也不支持并行。

你吃饭吃到一半,电话来了,你停了下来接了电话,接完后继续吃饭,这说明你支持并发。 (不一定是同时的)

你吃饭吃到一半,电话来了,你一边打电话一边吃饭,这说明你支持并行。

并发就是1个人吃3个苹果,并行就是3个人吃3个苹果。

并发的关键是你有处理多个任务的能力,不一定要同时。

并行的关键是你有同时处理多个任务的能力。

所以它们最关键的点就是:是否是『同时』

参考