并发,并行,进程,线程
无论是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。
写在最后
觉得简单问题,似乎在网上这些各种声音中被带东带西,还是需要沉下心来,看看书,思考下。豁然开朗。