早期浏览器 单进程(2007年以前)
不稳定、不流畅、不安全
因为只有进程,所以如果其中的线程崩溃会引起整个浏览器的崩溃。所有的页面渲染模块JavaScript执行环境以及插件都是运行在同一个线程中的,也就意味着同一时刻只能有一个模块可以执行。
不安全,插件可以使用C/C++等代码编写,可以获取操作系统的任意资源。页面脚本的话可以通过浏览器的漏洞来获取系统权限。
现代浏览器 多进程
早期多进程架构
插件进程、渲染进程、浏览器主进程
多进程,由于进程是互相隔离的,所以一个页面或者插件崩溃并不会影响到浏览器和其他页面。
采用多进程的额外好处是可以使用安全沙箱,Chrome吧插件进程和渲染进程所在沙箱里面。(安全沙箱的最小保护单位是进程,所以早期浏览器因为需要访问或者修改操作系统的数据,所以不能被安全沙箱保护。而多进程架构使得安全沙箱可以发挥作用)
随着chrome发展后的多进程架构
渲染进程、插件进程、网络进程、GPU进程、浏览器主进程
浏览器进程
主要负责界面显示、用户交互、子进程管理,同时提供存储等功能
渲染进程
核心任务是将HTML、CSS和JavaScript转换为用户可以与之交互的网页,排版引擎 Blink 和 Javascript 引擎 V8 都是运行在该进程中,默认情况下、Chrome会为每个Tab标签创建一个渲染进程。出于安全考虑,渲染进程都是运行在沙箱模式下。
GPU进程
Chrome刚开始发布的时候是没有GPU进程的。而GPU的使用初衷是为了实现 3D CSS 的效果,只是随后网页、Chrome的 UI 界面都选择采用 GPU 来绘制,这使得 GPU 成为浏览器普遍的需求,最后也引入了 GPU 进程
网络进程
主要是负责页面的网络资源加载,一开始是作为一个模块运行在浏览器进程里的,后来才独立出来,成为一个单独的进程
插件进程
主要是负责插件的运行,因为插件易崩溃,所以需要通过插件进程来隔离,以保证插件进程崩溃不会对浏览器和页面造成影响
多进程浏览器带来的问题
更高的资源占用
每个进程都会包含公共基础结构的副本(如Javascript的运行环境),浏览器将会消耗更多的内存资源
更复杂的体系架构
浏览器各模块之间耦合性高、扩展性差等问题,导致架构很难适应新的需求
面向服务架构(Services Oriented Architecture 简称 SOA)
Chrome 整体架构会朝着现代操作系统所采用的 “面向服务的架构” 方向发展,原来的各种模块会被重构成独立的服务,每个服务都可以在独立的进程中运行,访问服务必须使用定义好的接口,通过 IPC 来通信,从而构建一个更内聚、松耦合、易于维护和扩展的系统,更好实现 Chrome 简单、稳定、高速、安全的目标。