Skip to main content

现代网络浏览器

计算机系统层次

计算机结构

Machine Hardware 是计算机硬件,包括 CPU、GPU、内存、硬盘等。

Operating System 是操作系统,用于管理硬件资源,并为应用程序提供运行环境。

Application 是应用程序,例如浏览器,运行在操作系统之上,直接为用户提供功能。

计算机的核心是 CPU 和 GPU

CPU

CPU

CPU 全称中央处理器(Central Processing Unit),被视为计算机的大脑

CPU 主要负责三件事情:

  • 取指令(Fetch):从内存里拿下一步该做什么
  • 解码(Decode):搞懂这条指令的意思,比如是加法、存储还是跳转
  • 执行(Execute):实际去做这件事,比如加法、比较大小、把数据搬来搬去

在过去,CPU 通常是单个核心,但随着程序越来越复杂、需要处理的数据越来越多,单个核心的速度很难再提高(因为发热、功耗等限制),所以换个思路,增加核心数量,让多个核心并行工作。

GPU

GPU

GPU 全称图形处理器(Graphics Processing Unit),专门用于处理图像、视频和大量计算任务。

GPU 最早是为了让游戏画面流畅、视频更清晰,它能快速计算图形坐标、颜色、阴影、光照等复杂运算。

现代 GPU 不光画图,还被用在很多需要大量重复计算的场景:

  • 深度学习 / AI 训练:比如 ChatGPT 背后就用了大量 GPU
  • 科学计算:比如模拟天气、天体运动

这是因为 GPU 拥有成百上千个核心,适合做并行计算(把大任务拆成小任务,大家一起做)。

进程和线程

进程和线程

进程是正在执行的程序

线程是位于进程内部的执行单元

当用户启动一个应用程序时,会创建一个进程,进程可能会创建线程来帮助执行工作。

操作系统为进程分配一块内存空间供其使用,所有应用程序状态都保存在这个私有的内存空间中,直到用户关闭应用程序,进程也会终止,操作系统会释放内存。

一个进程可以要求操作系统启动另一个进程来运行不同的任务,当这种情况发生时,将为新进程分配不同的内存部分。

如果两个进程需要进行通信,可以通过进程间通信 IPC 来实现,常见方式有:管道、共享内存、消息队列、Socket 等。

浏览器架构

浏览器架构

关于如何构建网络浏览器,没有任何标准规范:

  • 可以是一个进程,包含许多不同线程(如图左侧)
  • 可以是许多不同的进程,通过 IPC 通信(如图右侧)

Chrome多进程

上图是 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 等平台就已采用类似的方法来合并进程以减少内存用量。

网站隔离

iframe

同源政策是 Web 的核心安全模型,它可确保一个网站在未经同意的情况下无法访问其他网站的数据。

进程隔离是分离网站的最有效方式,Chrome 为每个跨站点 iframe 运行单独的渲染器进程。

即使执行简单的 Ctrl+F 在网页中查找字词,也意味着需要跨不同的渲染程序进行搜索。

参考文章

https://developer.chrome.com/blog/inside-browser-part1/