浏览器的进程和线程
什么是并行处理
在了解进程和线程之前,先来看一下什么是并行处理;
计算机中的并行处理就是同一时刻处理多个任务,比如我们要计算下面这两个表达式的值,并显示出结果1
2A = 1+2
B = 2+3
在编写代码的时候,我们可以把这个过程拆分为三个任务:
- 任务 1 是计算 A=1+2;
- 任务 2 是计算 B=2+3;
- 任务 3 是显示最后计算的结果;
正常情况下,可以使用单线程来处理,也就是说分三步按照顺序分别执行;
如果采用多线程,会怎么样呢?我们只需分“两步走”:
- 第一步,使用两个个线程同时执行前两个任务;
- 第二步,再执行第四个显示任务。
通过对比分析,你会发现用单线程执行需要四步,而使用多线程只需要两步。因此,使用并行处理能大大提升性能。
进程 vs 线程
多线程可以并行处理任务,但是线程是不能单独存在的,它是由进程来启动和管理的
在很多地方我们都有看到一句话: 进程是CPU分配资源的最小单位,线程是CPU调度的最小单位。
那么如何理解这句话,如果把进程比作一个工厂,那么线程就像工厂中的员工,工厂与工厂之间相互独立,工厂中的员工相互协作完成任务,每个工厂至少都有一个员工,员工之间共享工厂的仓库。
进程和线程有以下四种关系
1. 进程中的任意一线程执行出错,都会导致整个进程的崩溃。
所以js(线程)执行报错时导致整个渲染进程停止工作,比如一个工人(线程)在流水线生产产品时由于操作失误,导致机器故障,那就会导致工厂(进程)停产。
也可以模拟以下场景:1
2A = 1+2
B = 20/0
当线程执行到 B = 20/0 时,由于分母为 0,线程会执行出错,这样就会导致整个进程的崩溃,当然另外线程执行的结果也没有了
2. 线程之间共享进程中的数据。
如上图所示,工人之间是共享工厂的仓库的,线程之间可以对进程的公共数据进行读写操作。
3. 当一个进程关闭之后,操作系统会回收进程所占用的内存。
当一个进程退出时,操作系统会回收该进程所申请的所有资源;即使其中任意线程因为操作不当导致内存泄漏,当进程退出时,这些内存也会被正确回收。
如果工厂关闭,工厂内的所有资源都会被回收。
4. 进程之间的内容相互隔离。
进程隔离是为保护操作系统中进程互不干扰的技术,每一个进程只能访问自己占有的数据,也就避免出现进程 A 写入数据到进程 B 的情况。如果进程之间需要通信,就需要用到进程之间相互通信的机制了。
比如Electron桌面应用中内部得也是chromium的内核,有两个进程,分别是Main主进程和Renderer渲染进程,两者的通信也是需要用到IPC (inter-process communication)
工厂与工厂之间相互独立,资源不共享。