进程与线程
进程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
低造成瓶颈。