浏览器是如何利用线程&进程

334 阅读4分钟

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机制实现异步)
  • 其他

\

【参考文献】

thiluxan.medium.com/how-web-bro…

levelup.gitconnected.com/how-web-bro…