# 浏览器的架构演变
基本都基于Chrome来讲述。现代浏览器基本都以Chromium为内核开发,所以我们跟进主流,其它的不做讨论。
# 前置知识
可以先回顾和补一下线程和进程的知识,以及他俩的区别。
# 单进程浏览器时代
浏览器的全部功能模块都运行在同一个浏览器进程中。这些模块包含了网络,插件,渲染引擎和页面,js运行环境。
这样的架构导致了不稳定,不流畅,不安全。
# 不稳定
早期浏览器的许多功能都依赖于外部插件来完成,像web视频,web游戏等。然而插件十分不稳定,是一个很容易出问题的模块。因为共用一个进程,所以一个插件的崩溃会引起整个浏览器的崩溃。另外,除了插件之外,一些复杂的javascript代码也可能引起渲染引擎的崩溃,从而引发浏览器的崩溃,可谓牵一发而动全身。
# 不流畅
例如javascript代码中意外的出现了某段无限循环的代码逻辑,每个页面的javascript运行线程都是同一个,这个无限循环的代码导致饿死了其它页面的javascript运行,一直在等待释放,所以导致其它页面出现了假死状态,失去响应,变得卡顿。
# 不安全
浏览器的插件可以获取到操作系统级别的任意资源,可想而知,如果是一个恶意插件,就可以做很多事情了。另外一些页面脚本,可以通过浏览器的漏洞获取系统权限,对电脑做一些恶意的事情。
# 多进程浏览器时代
基于浏览器的单进程时代带来的诸多问题,后面演变出了多进程模式。
早期时代:
- 浏览器主进程,负责进程间通信,下载资源等,可以认为是个总的协调模块。
- 插件进程
- 渲染进程,负责解析javascript,渲染页面,合成网页图片,跟前端比较靠近的东西,渲染进程运行在沙盒之中,不能获取到操作系统权限。
后来发展:
GPU和网络单独出来成为一个单独的进程模块。
- 1个浏览器主进程
- GPU进程
- 网络进程
- 多个渲染进程 沙盒隔离
- 多个插件进程 沙盒隔离