浏览器如何工作(一)进程架构

AI summary
date
Aug 12, 2024
slug
browser-w
status
Published
tags
技术
summary
现代浏览器的核心功能包括获取和展示资源,主要依赖于网络引擎、渲染引擎和脚本引擎。浏览器架构可分为单进程和多进程两种结构,多进程架构提供了更好的稳定性、安全性和可扩展性。
type
Post

浏览器的核心功能

浏览器,“浏览” 是这个产品的核心,浏览无非分为两步:
  1. 获取想浏览的资源
  1. 展示得到的资源
 
现代浏览器还增加了交互功能,这涉及到脚本运行。因此,理解浏览器的核心就是理解其三大引擎如何工作:
  • 网络引擎
  • 渲染引擎
  • 脚本引擎
 

浏览器架构的选择:单进程 vs 多进程

在设计浏览器这样复杂的程序时,我们面临两种基本结构的选择:
  1. 单进程 + 多线程:所有功能集中在一个进程中,通过多线程实现各个功能。
  1. 多进程 + 每个进程少量线程 + IPC 通信:核心服务被抽离成独立进程,进程间通过 IPC 通信。
 
单进程 ,多线程模式
单进程 ,多线程模式
 
多进程模式
多进程模式
选择哪种结构,这是一个值得考虑的问题。我们可以想想各自的优缺点:
 
单进程结构:
优点:
  1. 内存效率高,多个线程共享一个进程的内存开销
  1. 通信效率高,线程之间由于可以访问公共内存,通信开销较小
 
缺点:
  1. 稳定性差,一个线程挂掉可能引起整个进程挂掉(对于浏览器而言,这是致命的,比如一个页面挂掉,可能导致整个浏览器挂掉)
  1. 安全性差,进程之间可以访问公共内存,页面之间难以实现有效的沙箱隔离
  1. 可拓展性差,功能越多,意味着一个进程越来越大庞大,耦合难以避免的变多
 
多进程结构:
优点:
多进程程序解决了单进程的一些缺点
  1. 稳定性:一个进程挂了不会引起其他进程(一个页面挂了不会影响其他页面)
  1. 安全性:进程之间天然隔离,可以实现更严格的沙箱
  1. 利用现代 CPU:多进程可以更好的使用现代多核 CPU
  1. 拓展性:将各个模块抽离成一些独立的进程,实现解藕,单独维护
 
缺点:
  1. 更多的资源(内存,I/O,CPU时钟)消耗
  1. 更多的进程通信(IPC)开销
 

浏览器架构的历史演变

在回看一个产品时,不要脱离其历史背景。
早期的浏览器,功能简单,且计算机内存资源昂贵,此时单进程的设计也许更合理。
但随着人类社会的发展,计算资源相对宽裕,计算能力大幅度提升,且用户的复杂了很多,此时,多进程的结构更加合理。
浏览器架构的选择与其所处的时代背景密切相关:
  • 早期:功能简单,计算机资源昂贵,单进程设计更合理。
  • 现代:计算资源丰富,用户需求复杂,多进程结构更加适合。
 

现代多进程浏览器架构

前面提到,现代浏览器使用多进程的架构模式。
以我的 Chrome 浏览器举例:
notion image
  • 浏览器主进程:
    • 程序 UI(地址栏,书签栏,前进后退按钮)
    • 管理标签和窗口
    • 协调其他进程
    • 网络请求相关
  • GPU 进程:
    • 处理 GPU 任务,加速渲染
    • 处理 OpenGL 和 2D 绘图操作
    • 将渲染进程的绘制命令转为 GPU 命令
  • 实用工具进程:
    • 浏览器将一些特定的任务封装为了独立的进程,比如音频处理,文件解压,存储
  • 渲染进程
    • 浏览器会尽力为每个标签页提供一个独立的渲染进程
    • 解析和渲染网页资源
  • 拓展进程
    • 现代浏览器通过插件扩展功能,为了安全性,每个插件运行在一个独立的进程中
 
Chrome架构进化的目标是将整个浏览器程序的不同部分服务化,便于分割或合并。
 
前面提到,多进程架构会引起更多的内存和计算开销,所以 chrome 选择了更灵活的方式:
基本思路是:
  • 在高配设备中,每个服务独立开进程,保证稳定;
  • 在低配设备中,多个服务合并为一个进程,节约资源。同样的思路也应用到了Android上。
 

结语

一个应用的设计与其时代背景有关,技术的推进本质是用户需求的推进。而 Chrome 架构设计也充分体现了一个灵活的架构的优势。