并发,并行,进程,线程

无论是Java,还是JavaScript,在编程中都会遇到并发,并行问题,进而牵扯到线程,进程。这里就梳理下。

关于并发,并行的一个比喻

知乎上看到一个形象的比喻

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

OK,可以看出,并发,并行的根本区别,是同时

线程,进程

  • 进程就好比工厂的车间,它代表CPU所能处理的单个任务。任一时刻,CPU总是运行一个进程,其他进程处于非运行状态。
  • 一个车间里,可以有很多工人。他们协同完成一个任务。线程就好比车间里的工人。一个进程可以包括多个线程。
  • CPU同时刻只能执行一个进程,多核CPU当然就可以同时刻执行多个进程

JavaScript中的并发与并行

  • JavaScript中存在并发吗?

    YES,JavaScript有一个基于事件循环的并发模型,事件循环负责执行代码、收集和处理事件以及执行队列中的子任务。

  • JavaScript中存在并行吗
    NO,JavaScript是单线程的,同一时刻只可以做一件事情,但是注意,浏览器是多进程的,支持并发链接,进而同一时刻是可以多个连接同时进行的,所以比如并发发起XHR请求后,可能同时多个连接在处理中,比如加载JS资源,这些情况就是并行了。

Java中的并发与并行

如上并行的关键在于同时,比如机器,我们知道是有多核CPU的,但是比如JVM启动后是占用一个进程的,而线程是共享的进程资源,那么多核CPU就浪费了?

NO

在windows和linux里,Java线程与操作系统的线程映射关系是这样的一对一。所以说线程可以利用多核CPU。

写在最后

觉得简单问题,似乎在网上这些各种声音中被带东带西,还是需要沉下心来,看看书,思考下。豁然开朗。