1. 为什么学习多进程架构
网络流程、页面渲染过程、js执行流程、web安全理论。
这些知识分散在浏览器各功能组件中,学习多进程架构,有利于将这些分散的知识点,建立成知识体系。
本章只讲大体上的架构,模块功能会在后面的章节讲。
2. 浏览器的运行
Chrome的基本进程:
- 浏览器进程
- GPU进程
- 网络进程
- 渲染进程
3. 线程和进程
3.1 单线程和多线程
假设需求池里有3个需求
- 单线程:1个同事完成一个需求后,接着继续下一个需求的开发。串行
- 多线程:3个同事各自领取一个需求,同时开发。并行
3.2 线程与进程的关系
线程需要由进程来启动和管理
进程:一个程序的运行实例,或者说一个运行环境。
- 分配内存空间:存放代码、运行中的数据
- 一个执行中的主线程
线程依附于进程,进程使用多线程并行处理以提高效率。
3.3 线程和进程的特点
- 进程中的任一线程执行出错,都会导致整个进程奔溃。
- 线程之间共享进程中的数据。
- 进程关闭之后,操作系统会回收进程所占用的内存。
- 进程之间的内容相互隔离。(进程间通信IPC)
4. 单进程浏览器
所有功能模块都在一个进程
缺点:
- 不稳定:一个线程奔溃,整个浏览器奔溃
- 不流畅:进程中的页面线程包含了js环境,页面渲染,插件等模块,同一时间只能有一个模块运行。整个浏览器都会变卡,因为共用同一页面线程。
内存泄露也会导致不流畅,但回收内存只能等浏览器进程关闭才能回收。 - 不安全:插件和js都可以访问系统资源。
5. 多进程浏览器
5.1 早期多进程浏览器
- 多个插件进程
- 多个渲染进程
- 1个浏览器主进程
各个页面运行在单独的渲染进程中,各个插件也是运行在单独的插件进程中。不同进程通过IPC通信。
解决单进程浏览器问题:
- 不稳定:进程是相互隔离的。所以任一插件或页面奔溃,只会影响其本身进程,不会影响到浏览器和其他页面。解决了不稳定问题。
- 不流畅:js阻塞了渲染进程,也只是影响当前页面,不会影响其他页面。
内存泄露只要当前页面关闭,渲染进程也会关闭,便回收了内存。 - 不安全:插件进程和渲染进程都在安全沙箱中运行,不能在硬盘中写入任何数据,也不能在敏感位置读取任何数据。
5.2 目前多进程浏览器
- 多个插件进程
- 多个渲染进程
- 1个浏览器主进程
- 1个网络进程
- 1个GPU进程
- 浏览器主进程:界面UI显示(网页之外的那个壳),用户交互,子进程管理,提供存储功能。
- 网络进程:页面的网络资源加载。之前在浏览器主进程中,现在独立出来。
- GPU进程:初衷是为了实现3D css效果。现在网页页面、浏览器界面UI都使用GPU渲染。
- 插件进程:运行插件。安全沙箱内。
- 渲染进程:运行排版引擎Blink和js引擎V8。每个Tab标签都是一个渲染进程。核心任务是将HTML CSS JS转换为用户可以交互的网页。安全沙箱内。
5.3 目前多进程浏览器特点
至少拥有4个进程:
- 浏览器进程
- 网络进程
- GPU进程
- 渲染进程
优点:
- 稳定性
- 流畅性
- 安全性
缺点:
- 进程多,更高的资源占用。
- 浏览器模块耦合性强,难以扩展。更复杂的体系架构。
5.4 未来面向服务的架构
面向服务的架构(Services Oriented Architecture,简称SOA)
原来的各种模块会被重构成独立的服务(Service),每个服务(Service)都可以在独立的进程中运行,访问服务(Service)必须使用定义好的接口,通过 IPC 来通信
构建一个更内聚、松耦合、易于维护和扩展的系统。
也可以理解为,颗粒化程度越细了。
在资源受限的设备,使用以下架构
6. 遗留
- 线程进程图里的文件是什么?
- 渲染进程核心任务是将html css js转换成用户可以交互的网页,跟gpu进程的关系?
- GPU进程是什么
- 浏览器进程间通信ICP是?