Skip to content
On this page

1. 为什么学习多进程架构

网络流程、页面渲染过程、js执行流程、web安全理论。
这些知识分散在浏览器各功能组件中,学习多进程架构,有利于将这些分散的知识点,建立成知识体系。
本章只讲大体上的架构,模块功能会在后面的章节讲。

2. 浏览器的运行

Chrome的基本进程:

  • 浏览器进程
  • GPU进程
  • 网络进程
  • 渲染进程

3. 线程和进程

3.1 单线程和多线程

假设需求池里有3个需求

  • 单线程:1个同事完成一个需求后,接着继续下一个需求的开发。串行
  • 多线程:3个同事各自领取一个需求,同时开发。并行

3.2 线程与进程的关系

线程需要由进程来启动和管理

进程:一个程序的运行实例,或者说一个运行环境。

  • 分配内存空间:存放代码、运行中的数据
  • 一个执行中的主线程

线程依附于进程,进程使用多线程并行处理以提高效率。

3.3 线程和进程的特点

  1. 进程中的任一线程执行出错,都会导致整个进程奔溃。
  2. 线程之间共享进程中的数据。
  3. 进程关闭之后,操作系统会回收进程所占用的内存。
  4. 进程之间的内容相互隔离。(进程间通信IPC)

4. 单进程浏览器

所有功能模块都在一个进程

缺点:

  • 不稳定:一个线程奔溃,整个浏览器奔溃
  • 不流畅:进程中的页面线程包含了js环境,页面渲染,插件等模块,同一时间只能有一个模块运行。整个浏览器都会变卡,因为共用同一页面线程。
    内存泄露也会导致不流畅,但回收内存只能等浏览器进程关闭才能回收。
  • 不安全:插件和js都可以访问系统资源。

5. 多进程浏览器

5.1 早期多进程浏览器

  1. 多个插件进程
  2. 多个渲染进程
  3. 1个浏览器主进程

各个页面运行在单独的渲染进程中,各个插件也是运行在单独的插件进程中。不同进程通过IPC通信。

解决单进程浏览器问题:

  • 不稳定:进程是相互隔离的。所以任一插件或页面奔溃,只会影响其本身进程,不会影响到浏览器和其他页面。解决了不稳定问题。
  • 不流畅:js阻塞了渲染进程,也只是影响当前页面,不会影响其他页面。
    内存泄露只要当前页面关闭,渲染进程也会关闭,便回收了内存。
  • 不安全:插件进程和渲染进程都在安全沙箱中运行,不能在硬盘中写入任何数据,也不能在敏感位置读取任何数据。

5.2 目前多进程浏览器

  1. 多个插件进程
  2. 多个渲染进程
  3. 1个浏览器主进程
  4. 1个网络进程
  5. 1个GPU进程
  • 浏览器主进程:界面UI显示(网页之外的那个壳),用户交互,子进程管理,提供存储功能。
  • 网络进程:页面的网络资源加载。之前在浏览器主进程中,现在独立出来。
  • GPU进程:初衷是为了实现3D css效果。现在网页页面、浏览器界面UI都使用GPU渲染。
  • 插件进程:运行插件。安全沙箱内。
  • 渲染进程:运行排版引擎Blink和js引擎V8。每个Tab标签都是一个渲染进程。核心任务是将HTML CSS JS转换为用户可以交互的网页。安全沙箱内。

5.3 目前多进程浏览器特点

至少拥有4个进程:

  1. 浏览器进程
  2. 网络进程
  3. GPU进程
  4. 渲染进程

优点:

  1. 稳定性
  2. 流畅性
  3. 安全性

缺点:

  1. 进程多,更高的资源占用。
  2. 浏览器模块耦合性强,难以扩展。更复杂的体系架构。

5.4 未来面向服务的架构

面向服务的架构(Services Oriented Architecture,简称SOA)

原来的各种模块会被重构成独立的服务(Service),每个服务(Service)都可以在独立的进程中运行,访问服务(Service)必须使用定义好的接口,通过 IPC 来通信

构建一个更内聚、松耦合、易于维护和扩展的系统。
也可以理解为,颗粒化程度越细了。

在资源受限的设备,使用以下架构

6. 遗留

  1. 线程进程图里的文件是什么?
  2. 渲染进程核心任务是将html css js转换成用户可以交互的网页,跟gpu进程的关系?
  3. GPU进程是什么
  4. 浏览器进程间通信ICP是?