现代网络浏览器
计算机系统层次
Machine Hardware 是计算机硬件,包括 CPU、GPU、内存、硬盘等。
Operating System 是操作系统,用于管理硬件资源,并为应用程序提供运行环境。
Application 是应用程序,例如浏览器,运行在操作系统之上,直接为用户提供功能。
计算机的核心是 CPU 和 GPU
CPU
CPU 全称中央处理器(Central Processing Unit),被视为计算机的大脑。
CPU 主要负责三件事情:
- 取指令(Fetch):从内存里拿下一步该做什么
- 解码(Decode):搞懂这条指令的意思,比如是加法、存储还是跳转
- 执行(Execute):实际去做这件事,比如加法、比较大小、把数据搬来搬去
在过去,CPU 通常是单个核心,但随着程序越来越复杂、需要处理的数据越来越多,单个核心的速度很难再提高(因为发热、功耗等限制),所以换个思路,增加核心数量,让多个核心并行工作。
GPU
GPU 全称图形处理器(Graphics Processing Unit),专门用于处理图像、视频和大量计算任务。
GPU 最早是为了让游戏画面流畅、视频更清晰,它能快速计算图形坐标、颜色、阴影、光照等复杂运算。
现代 GPU 不光画图,还被用在很多需要大量重复计算的场景:
- 深度学习 / AI 训练:比如 ChatGPT 背后就用了大量 GPU
- 科学计算:比如模拟天气、天体运动
这是因为 GPU 拥有成百上千个核心,适合做并行计算(把大任务拆成小任务,大家一起做)。
进程和线程
进程是正在执行的程序
线程是位于进程内部的执行单元
当用户启动一个应用程序时,会创建一个进程,进程可能会创建线程来帮助执行工作。
操作系统为进程分配一块内存空间供其使用,所有应用程序状态都保存在这个私有的内存空间中,直到用户关闭应用程序,进程也会终止,操作系统会释放内存。
一个进程可以要求操作系统启动另一个进程来运行不同的任务,当这种情况发生时,将为新进程分配不同的内存部分。
如果两个进程需要进行通信,可以通过进程间通信 IPC 来实现,常见方式有:管道、共享内存、消息队列、Socket 等。
浏览器架构
关于如何构建网络浏览器,没有任何标准规范:
- 可以是一个进程,包含许多不同线程(如图左侧)
- 可以是许多不同的进程,通过 IPC 通信(如图右侧)
上图是 Chrome 浏览器的多进程架构:
- Browser Process,浏览器主进程,控制应用的地址栏、书签、返回和前进按钮
- 几乎所有用户的操作(点击链接、输入网址)都会先经过主进程
- Renderer Process,控制显示网站的标签页中的所有内容(浏览器为每个标签页都创建一个 Renderer Process)
- 渲染进程是最容易崩溃的进程(例如 JS 死循环、内存泄漏)
- GPU Process,隔离地处理 GPU 任务,不受其他进程的影响,它会分隔到不同的进程中,因为 GPU 需要接收来自多个进程的绘图请求,进行合成并渲染到屏幕上
- Utility Process,负责系统层面的后台任务,例如网络请求、音频处理、文件系统访问等
- Plugin Process,控制网站使用的所有插件,例如 Flash
- 现代浏览器已经基本淘汰 Plugin Process,因为 Flash 等插件已被弃用
可以通右上角的选项菜单->更多工具->任务管理器来查看当前正在运行的进程。
多进程架构的好处
- 如果某个标签页无响应,可以关闭该标签页并继续操作,同时让其他标签页保持活跃状态;如果所有标签页都在一个进程中运行,当一个标签页无响应时,所有标签页都会无响应
- 由于操作系统提供了限制进程权限的方法,因此浏览器可以将某些进程沙盒化,使其无法使用某些功能,提高安全性
- 例如,Chrome 浏览器会限制处理任意用户输入的进程(例如渲染程序进程)的任意文件访问权限
进程服务化
由于进程有自己的私有内存空间,它们通常包含了常用的基础架构的副本(例如 JavaScript 引擎 V8),这意味着内存用量会增加。
JavaScript 引擎 V8,不仅运行在每个 Renderer Process 上,还运行在 Extension Process 等其它进程。
为了节省内存,Chrome 对其可以启动的进程数量施加了限制,此限制因设备的内存和 CPU 功率而异。但当进程数量达到限制时,它会开始在一个进程中运行来自同一网站的多个标签页。
Chrome 浏览器正在进行架构变更,以便将浏览器程序的每个部分都作为服务运行,从而允许分成不同的进程或合并到一个进程。
一个服务可以在一个独立的进程中运行,也可以与其它服务共享同一个进程:
- 在强大的硬件上运行时,Chrome 会将每项服务拆分为不同的进程,以提高稳定性
- 在资源受限的设备上运行,Chrome 会将服务合并到一个进程中,以节省内存占用空间
Android 等平台就已采用类似的方法来合并进程以减少内存用量。
网站隔离
同源政策是 Web 的核心安全模型,它可确保一个网站在未经同意的情况下无法访问其他网站的数据。
进程隔离是分离网站的最有效方式,Chrome 为每个跨站点 iframe 运行单独的渲染器进程。
即使执行简单的 Ctrl+F 在网页中查找字词,也意味着需要跨不同的渲染程序进行搜索。