Chrome架构
# Chrome架构
# 进程与线程
一个进程就是一个程序的运行实例——启动一个程序时,操作系统会为该进程创建一块内存,用来存放代码、运行中的数据和一个执行任务的主线程。
线程不能单独存在,它是由进程来启动和管理的
- 进程中的任意一线程执行出错,都会导致整个进程的崩溃
- 线程之间共享进程中的数据
- 当一个进程关闭之后,操作系统会回收进程所占用的内存
- 进程之间的内容相互隔离
# 单进程浏览器
早期(2007年之前)的浏览器都是单进程浏览器。 也就是说:页面渲染、页面展现、JavaScript运行环境、插件都运行在一个进程中。这导致了一些问题:不稳定、不流畅、不安全。
- 不稳定:插件、渲染引擎模块都不稳定,意外崩溃会导致浏览器也跟着崩溃
- 不流畅:同一时刻只能有一个模块可以执行,独占整个线程;插件、脚本可能会导致页面的内存泄露
- 不安全:恶意插件、脚本可能会攻击页面
# 多进程浏览器
2008年Google发布了多进程架构的浏览器Chrome
- 浏览器主进程(下载资源、管理IPC、显示渲染进程生成的图片)
- 渲染进程(解析、渲染、JavaScript执行、合成网页图片)(渲染进程运行在沙箱sandbox中,不能读写硬盘上的数据,不能获取操作系统权限)
- 插件进程(运行插件)
进程之间通过IPC进行通信
解决了哪些问题:
- 不稳定:进程间相互隔离,一个页面或插件崩溃不会使其他页面与浏览器崩溃
- 不流畅:不同页面在不同渲染进程中运行
- 内存泄漏:关闭一个页面,对应的渲染进程也会被关闭,该进程的内容会被系统回收
- 不安全:安全沙箱机制
# Chrome的多进程架构
- 浏览器主进程:负责界面显示、用户交互、子进程管理,同时提供存储等功能
- GPU进程:UI页面使用GPU绘制
- 网络进程:负责页面的网络资源加载
- 渲染进程:将HTML、CSS、JavaScript转换为用户可以与之交互的网页,排版引擎Blink与JavaScript引擎V8都运行在该进程中;Chrome会为每一个Tab标签创建一个渲染进程,并且运行在沙箱模式下
- 插件进程:复杂插件的运行
但是这也会造成一些问题:
- 更高的资源占用
- 更复杂的体系架构
# 面向服务的架构
2016年,Chrome团队使用面向服务的架构(SOA, Services Oriented Architecture)的思想设计了新的Chrome架构
将原来的各种模块重构为独立的服务(Services),每个服务可以在独立的进程中运行,访问服务必须使用定义好的接口,通过IPC进行通信。
Chrome最终要把UI、数据库、文件、设备、网络等模块重构为基础服务,类似操作系统底层服务。