Chrome的调试与架构
调试
功能
请求用时分布
架构
多线程
- 多线程也就是单进程,浏览器是指浏览器的所有功能模块都是运行在同一个进程里,这些模块包含了网络、插件、JavaScript 运行环境、渲染引擎和页面等
-
多线程的缺点
-
不稳定
- 早期浏览器需要借助于插件来实现诸如 Web 视频、Web 游戏等各种强大的功能,但是插件是最容易出问题的模块,并且还运行在浏览器进程之中,所以一个插件的意外崩溃会引起整个浏览器的崩溃
- 除了插件之外,渲染引擎模块也是不稳定的,通常一些复杂的 JavaScript 代码就有可能引起渲染引擎模块的崩溃。和插件一样,渲染引擎的崩溃也会导致整个浏览器的崩溃
-
不流畅
- 所有页面的渲染模块、JavaScript 执行环境以及插件都是运行在同一个线程中的,这就意味着同一时刻只能有一个模块可以执行
- 运行一个复杂点的页面再关闭页面,会存在内存不能完全回收的情况,这样导致的问题是使用时间越长,内存占用越高,浏览器会变得越慢
-
不安全
- 过插件可以获取到操作系统的任意资源,当你在页面运行一个插件时也就意味着这个插件能完全操作你的电脑。如果是个恶意插件,那么它就可以释放病毒、窃取你的账号密码,引发安全性问题
-
不稳定
多进程
-
浏览器进程
- 主要负责界面显示、用户交互、子进程管理,同时提供存储等功能
-
渲染进程
- 核心任务是将 HTML、CSS 和 JavaScript 转换为用户可以与之交互的网页
- 排版引擎 Blink 和 JavaScript 引擎 V8 都是运行在该进程中
- 默认情况下,Chrome 会为每个 Tab 标签创建一个渲染进程
- 出于安全考虑,渲染进程都是运行在沙箱模式下
-
插件进程
- 主要是负责插件的运行
- 因插件易崩溃,所以需要通过插件进程来隔离,以保证插件进程崩溃不会对浏览器和页面造成影响
-
多进程的优点
-
稳定性
- 由于进程是相互隔离的,所以当一个页面或者插件崩溃时,影响到的仅仅是当前的页面进程或者插件进程,并不会影响到浏览器和其他页面
-
流畅性
- 即使 JavaScript 阻塞了渲染进程,影响到的也只是当前的渲染页面,而并不会影响浏览器和其他页面,因为其他页面的脚本是运行在它们自己的渲染进程中的,所以没有响应的仅仅是当前页面
- 当关闭一个页面时,整个渲染进程也会被关闭,之后该进程所占用的内存都会被系统回收,这样就轻松解决了浏览器页面的内存泄漏问题
- 即使 JavaScript 阻塞了渲染进程,影响到的也只是当前的渲染页面,而并不会影响浏览器和其他页面,因为其他页面的脚本是运行在它们自己的渲染进程中的,所以没有响应的仅仅是当前页面
-
安全性
- 可以把插件进程和渲染进程单独放到安全沙箱中,使之不能在你的硬盘上写入任何数据,也不能在敏感位置读取任何数据,例如你的文档和桌面
- 这样即使在渲染进程或者插件进程里面执行了恶意程序,恶意程序也无法突破沙箱去获取系统权限
-
稳定性
-
多进程的缺点
- 更高的资源占用
- 因为每个进程都会包含公共基础结构的副本(如 JavaScript 运行环境),这就意味着浏览器会消耗更多的内存资源
- 架构的耦合
- 浏览器各模块之间耦合性高、扩展性差等问题,会导致现在的架构已经很难适应新的需求了
- 更高的资源占用
面向服务(SOA)
- Chrome 整体架构会朝向现代操作系统所采用的 “面向服务的架构” 方向发展
- 原来的各种模块会被重构成独立的服务(Service),每个服务(Service)都可以在独立的进程中运行,访问服务(Service)必须使用定义好的接口,通过 IPC 来通信
- 从而构建一个更内聚、松耦合、易于维护和扩展的系统