并发和并行
并发(concurrency):指在同一时刻只能有一条指令执行,但多个进程指令被快速的轮换执行,使得在宏观上具有多个进程同时执行的效果,但在微观上并不是同时执行的,只是把时间分成若干段,使多个进程快速交替的执行。
并行(parallel):指在同一时刻,有多条指令在多个处理器上同时执行。所以无论从微观还是从宏观来看,二者都是一起执行的。
并发的关键是你有处理**多个**任务的能力,并行的关键就是你能同时处理多个任务的能力。
进程和线程
进程
进程就好比一个程序运行的实例,它是资源(CPU,内存等)分配的最小单位。计算机在同一时刻执行的进程不会超过CPU核心数,多进程能够的正常运行,靠的是CPU在进程间的快速切换。
线程
线程是程序实例执行时的最小单位,是CPU调度和分派的基本单位。线程是程序的实际执行者,线程之间可以共享进程的资源。
联系:一个进程可以包含多个线程,但一个线程只能属于一个进程。
区别:
- 进程是资源分配的最小单位,线程是cpu调度和分派的最小单位
- 进程有独立的地址空间,启动一个进程,就会单独为其分配地址空间,这种代价相对于线程很高;线程可以共享进程的资源,不需要单独申请地址空间。因此,CPU切换一个线程比进程花费小,同时创建一个线程也比进程小很多。
- 线程间通信更方便,共享进程的全局变量等;进程通信要通过IPC通信。
- 进程更健壮,多个进程有一个挂掉,不会影响正常运行;一个进程中多个线程,其中一个挂掉,整个进程就挂了。
协程
英文Coroutines,是一种比线程更加轻量级的存在。正如一个进程可以拥有多个线程一样,一个线程也可以拥有多个协程。
最重要的是,协程不是被操作系统内核所管理,而完全是由程序所控制(也就是在用户态执行)。
这样带来的好处就是性能得到了很大的提升,不会像线程切换那样消耗资源。
在node.js 执行async函数就是运行一段协程代码,await关键字就是切换协程,在await后就去执行其他协程的代码了。