浏览器结构
进程与线程
- 一个进程就是一个程序的运行实例。详细解释就是,启动一个程序的时候,操作系统会为该程序创建一块内存,用来存放代码、运行中的数据和一个执行任务的主线程,我们把这样的一个运行环境叫进程。
- 进程中包括很多线程,公用一个内存块,数据互通,一个线程崩溃会使得整个进程崩溃。
- 当一个进程关闭之后,操作系统会回收进程所占用的内存
- 进程之间的内容相互隔离
单进程浏览器
- 不稳定性|一个线程崩溃浏览器崩溃
- 不流畅|页面进程任务阻塞
- 不安全|单页面可以拿到真个浏览器数据(页面间内存泄漏)
多进程浏览器
一个页面一个进程
安全问题:Chrome 把插件进程和渲染进程锁在沙箱里面
- 浏览器进程负责页面显示/交互/子进程管理等
- 渲染进程。将 HTML、CSS 和 JavaScript 转换为用户可以与之交互的网页,排版引擎 Blink 和 JavaScript 引擎 V8 都是运行在该进程中,Chrome 会为每个 Tab 标签创建一个渲染进程。出于安全考虑,渲染进程都是运行在沙箱模式下。
- 网络进程。负责页面的网络资源加载,之前是进程模块选择被独立出来。
- 插件进程。插件易崩溃,所以需要通过插件进程来隔离。
- GPU 进程如今前端对于GPU资源的使用变多浏览器也加入了专门的GPU进程。
同站进程共享
有时候同一站点的不同页面会互相调用脚本,现在浏览器默认一个标签一个进程,但是从一个页面打开了一个同站点的页面,那么新页面与父页面共享复用。这样有时导致多进程浏览器还是单页卡死整个崩溃。
总结
- 早期浏览器:不稳定(单独进程) 不流畅(单独进程) 不安全(沙箱)
- 早期多进程浏览器: 主进程 渲染进程 插件进程
- 现代多进程架构: 主进程 渲染进程 插件进程 GPU进程 网络进程
- 未来面向服务架构: 将UI/文件/AUDIO/网络等进程分离作为底层基础服务。