1. 进程和线程概念
进程可以描述为应用程序的执行程序,是一个独立的个体,有自己的生命周期。
- 一个进程也可以触发操作系统启动另一个进程。
- 进程可以跟自己创造的线程交互。
- 进程可以跟其他进程交互。
线程是位于进程内部并执行其进程程序任何部分的线程。
- 线程可以跟线程交互
- 线程可以跟进程交互
当在web处理器中发出应用程序或请求(url)时,将启动一个进程来执行该应用程序或请求。然后,该过程可能会创建线程,以使任务更容易。当应用程序关闭时,该进程也将销毁。
\
\
2. 浏览器进程/线程时代
\
【原始时代——单窗口、单Tab时代】
最初,一个浏览器就一个窗口,一个tab,也就是用户只能在浏览器中打开一个页面进行操作,因此a标签的跳转还不没有另起一个tab的说法。
【过渡阶段】
浏览器开始采用多进程或多线程的概念作为核心功能,但是浏览器中没有关于它们的标准实践或方法。有的浏览器可能有一个进程有多个线程,有的浏览器可能有多个进程多线程。不同浏览器厂商,对于多进程&多线程的实践方案还没有统一的标准。
【多进程浏览器】
后来应运而生了多进行浏览器。因为多进程的好处多多:
- 多进程的一个优点是,一个进程崩溃了,不会影响到另一个进程,因此另一个进程是可以正常运行的。
- 多进程的另一个优点是安全性和沙盒(sand-box)。当浏览器在强大的硬件上运行时,多进程架构允许它将进程拆分为多个,并且可以有效地利用主内存,而不会过度消耗。
一般一个程序的运行,需要多种线程:JS引擎线程、GUI线程、网络服务线程、存储服务线程、定时器线程等,而这里面的一个或多个线程都源自于某种进程。
\
3. 了解google浏览器的进程&线程架构
\
我们现在的主流浏览器都支持多窗口,多Tab;下图👇🏻就展示了一个窗口,一个窗口里面可以打开许多个tab。
3.1 主进程
就拿Google浏览器来说,它是个多进程浏览器。在所有进程之上,有一个主进程(称浏览器进程)。主进程将被分为
- 渲染进程(Render Process),可以被分成更多的进程,每个进程会在单独的Tab中被打开。
- 实用程序进程(Utility Proceess),有以下几部分构成
-
- 网络服务进程(Network Service)
- 存储进程(Storage Service)
-
- 音频进程(Audio Service)
- 数据解码服务进程(Data Decoder Service)
-
- 其他
- GPU进程(GPU Process)
- 插件进程(Plugin Process)
- 扩展程序进程
- 其他
打开google的任务管理器(TaskManager),清晰的列出了所有打开的进程。
\
这里印证了多进程的优势,如果其中一个标签页崩溃了,其他的标签页是不受影响的,标签页之间相互隔离。
3.2 渲染进程(Render Process)
渲染进程用来管理一个独立的tab的正常运行,也就是说从一个tab被打开后,输入url到最后怎么呈现给用户,怎么和用户交互都是这个渲染进程要做的事情。而这个渲染进程不是隔离的,她需要与其他进程(比如网络服务进程、存储进程等)完美配合才能完成整个流程。
渲染进程支持线程机制,也就是说一个渲染进程会创建一个主线程和多个线程,主线程有主控权,控制任务的执行顺序和分配,除主线程外的其他线程有:
- I/O线程,负责进程间通信,也就是说渲染进程和GUI进程的通信是依赖这个I/O线程的。
- JS引擎线程,处理JS的执行
- 事件处理线程,常说的浏览器事件机制与之相关。
- GUI线程:我理解为向GUI进程申请一个GUI线程来专门服务于当前tab
- 网络服务线程:我理解为向网络服务进程申请一个网络服务线程来专门服务于当前tab
- worker线程(允许js的执行通过worker机制实现异步)
- 其他
\
【参考文献】