我们先来回顾一下进程线程的概念。
进程是操作系统分配资源的最小单位,一个进程包含数据段、代码段、堆栈段等内存空间;一个进程可以创建多个线程,线程是 CPU 任务调度的最小单位。
早期的浏览器是单进程的,该进程包含渲染、网络等线程,用于处理所有 tab 页面的渲染以及网络资源的下载。这些线程共用数据段、堆栈段等内存资源,一旦某个环节出问题,会造成整个浏览器的崩溃。
现代浏览器是一个多进程多线程的模型,每个进程专门负责一部分工作。现代浏览器大概包含以下进程:
| 进程 | 作用 |
|---|---|
| 浏览器进程 | 展示浏览器界面、前进后退,管理子进程等 |
| 渲染进程 | 渲染页面 |
| 网络进程 | 负责网络资源加载 |
| GPU 进程 | 负责处理 GPU 任务 |
| 插件进程 | 负责运行浏览器的各种插件 |
我们可以通过点击浏览器 More Tools => Task Manager 查看浏览器的进程有哪些。
当然也可以通过操作系统的任务管理器过滤出所有 chrome 相关的进程,还可以查看该进程启动了哪些线程。
在 chrome 中,每个 tab 页都有一个独立的渲染进程,即使其中一个页面出错,也不影响其他页面。
当然,这意味着更高的内存占用。所以,chrome 计划为每个站点创建一个渲染进程,比如 github.com 这个域名下的所有 tab 页共用一个渲染进程。这样一来,其中一个页面出错,只会影响所有 github 相关的页面,但是能大量减少内存占用。(详情查看文档)