进程与线程

进程Process

进程是资源分配和调度的最小单位。

进程有独立的地址空间。

一个程序至少有一个进程,一个进程至少有一个线程。

线程Thread

线程是程序执行(进行运算调度)的最小单位。

在同一个进程中可以存在多个线程,使用同一个进程的存储空间,共享内存。

一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。

JS是单线程的

多线程可以共享内存,如果JS是多线程的,同时操作相同数据可能会出现竞态条件,会发生数据错误。多个线程会有更复杂的操作逻辑和多线程维护成本。

这主要和js的用途有关,js是作为浏览器的脚本语言,主要是实现用户与浏览器的交互,以及操作dom;这决定了它只能是单线程,否则会带来很复杂的同步问题。 举个例子:如果js被设计了多线程,如果有一个线程要修改一个dom元素,另一个线程要删除这个dom元素,此时浏览器就会一脸茫然,不知所措。所以,为了避免复杂性,从一诞生,JavaScript就是单线程,这已经成了这门语言的核心特征,将来也不会改变。

为了利用多核CPU的计算能力,HTML5提出Web Worker标准,允许JavaScript脚本创建多个线程,但是子线程完全受主线程控制,且不得操作DOM。所以,这个新标准并没有改变JavaScript单线程的本质。

区别

多进程消耗要比多线程消耗大,效率要小。

总结

操作系统的设计,因此可以归结为三点:

(1)以多进程形式,允许多个任务同时运行;

(2)以多线程形式,允许单个任务分成不同的部分运行;

(3)提供协调机制,一方面防止进程之间和线程之间产生冲突,另一方面允许进程之间和线程之间共享资源。

相关概念&公式

最佳线程数 = ( RT / CPU Time ) * CPU核数 * CPU利用率

RT = CPU Time + Wait Time

单线程QPS(吞吐量) = 1000ms / ( Wait Time + CPU Time )

CPU Time决定因素:数据结构 + 算法

CPU利用率:I/O能力、数据库连接池、内存不足、共享资源竞争、所依赖的其他后端服务QPS低造成瓶颈。

参考链接

一篇让你明白进程与线程之间的区别与联系 – 掘金

进程与线程的一个简单解释 – 阮一峰