01 Chrome 架构:仅仅打开一个页面,为什么有 4 个进程?
一、浏览器架构
1.1 进程和线程
一个进程对应一个程序的运行实例。启动一个程序,操作系统会为该程序创建一块内存,用来存放代码、运行中的数据和一个执行任务的主线程,这样的一个环境叫主线程
线程依附于进程,线程之间共享进程中的数据
1.2 单进程架构
单进程浏览器指浏览器的所有功能模块都运行在同一个进程里
模块包括
- 网络
- 插件
- JavaScript 运行环境
- 渲染引擎
- 页面
- …
产生的问题
- 不稳定
单进程浏览器实现各种强大功能,需要借助插件,但是插件是容易出问题的模块,又因为各模块都运行在浏览器进程中,一个插件的崩溃会引起整个浏览器的崩溃 - 不流畅
所有页面的渲染模块、JavaScript 运行环境以及插件运行在同一个线程(页面线程),所以同一时刻只能有一个模块得到执行
如果存在一个无限循环的页面脚本,则会独占整个线程
导致运行在当前页面线程的其他模块没有机会被执行
浏览器中所有页面都运行在该线程中,因此所有页面都没有机会执行任务 - 不安全
通过插件解压获取到操作系统的任意资源,然后可以做任意操作
页面脚本可以通过浏览器的漏洞来获取系统权限,然后可以做任意操作
1.3 多进程架构
如何解决单进程架构的不稳定、不流畅、不安全
打开的页面和页面中使用的插件分别运行在渲染进程、插件进程中,进程之间通过 IPC 机制进行通信
- 解决不稳定:避免一个页面崩溃,然后整个浏览器崩溃
当一个页面或插件的崩溃,影响的只是当前的页面进程或插件进程,并不会影响到浏览器和浏览器中的其它页面 - 解决不流畅:让不同页面的执行是并行的
某个页面的不流畅,影响的只是当前页面进程,并不会影响到浏览器和浏览器中的其它页面 - 解决不安全:隔离渲染进程和插件进程,放到安全沙箱中执行
沙箱是操作系统给进程上了一把锁,沙箱里的程序可以运行,但是不能在硬盘上写数据,也不能在敏感位置(桌面、文档等)读数据,即使渲染进程和插件进程中的恶意程序执行了,也无法突破安全沙箱而获取系统权限
1.4 目前多进程架构
最新的 Chrome 浏览器包括:1 个浏览器主进程、1 个 GPU 进程、1 个网络进程、多个渲染进程、多个插件进程
- 浏览器主进程:主要负责界面显示、用户交互、子进程管理,提供存储等功能
- 渲染进程:核心任务是将 HTML、CSS、JavaScript 转换为用户可以与之交互的网页,排版引擎 Blink 和 JavaScript 引擎 V8 运行在该进程,默认情况下,Chrome 会为每个 Tab 标签创建一个渲染进程(渲染进程运行在沙箱模式下)
- GPU 进程:网页、Chrome 的 UI 界面采用 GPU 绘制
- 网络进程:主要负责页面的网络资源加载
- 插件进程:主要负责插件的运行,插件易崩溃,所以运行在单独的插件进程中,确保插件崩溃使插件进程崩溃,但不会对浏览器和浏览器其它页面产生影响
二、标题答案
打开一个页面,至少有 4 个进程:浏览器主进程、GPU 进程、网络进程、渲染进程(如果有扩展,那么还会多一个插件进程)