【浏览器原理-1】体系结构
课程链接:https://time.geekbang.org/column/intro/100033601?tab=catalog
进程和线程
基本概念
- 进程:一个进程就是一个程序的运行实例。
- 线程:并发调度的基本单位。线程是由进程启动和管理的,但它不能单独存在。
几个要点
- 进程中的任意一线程执行出错,都会导致整个进程的崩溃。
- 线程之间共享进程的数据。
- 当一个进程关闭之后,操作系统会回收进程所占用的内存。哪怕是其中某个线程发生了内存泄漏。
- 进程与进程之间的内容相互隔离,需要通过 IPC 机制进行通信。

单进程浏览器模型
介绍
顾名思义,单进程浏览器的各个部分都运行在一个进程里。渲染、插件、JavaScript、页面等各个模块则以线程的形式存在。
单进程浏览器一般分为下面的线程:
- 网络线程
- 页面线程:页面渲染、展现、JS 执行、插件
- 其他线程

三大问题
- 不稳定:浏览器插件和页面渲染之类的内容很容易崩溃。上面说过,单个线程出错都会导致整个进程的崩溃。如果浏览器有多个标签,那么只要一个标签页崩溃了,整个浏览器也就崩溃了。
- 不流畅:
- 页面之类的代码都集中在一个线程,这意味着同一时间只有一个模块在执行操作。一旦执行一些耗时的 JS 代码,页面会出现卡顿。
- 页面关闭时,有时候内存没有完全释放,导致内存泄漏,进而导致浏览器卡顿。
- 不安全:插件可以执行一些系统级别的操作;而页面和 JS 代码可以通过利用浏览器的安全漏洞来执行一些系统级别的操作。这对于用户电脑是非常危险的。
早期多进程架构
介绍
在这种体系架构里面,一个浏览器运行则拥有多个进程。常见的进程:
- 插件进程(多个):执行插件的代码
- 渲染进程(多个):负责页面的解析和渲染,执行 JS 代码。一个页面通常有一个渲染进程。
- 浏览器主进程:页面展示、用户交互、下载资源、管理文件、管理 IPC 等
其中,插件进程 和 渲染进程 运行在沙箱中,无法直接进行系统级别的操作(如文件读写)。

解决三大问题
- 不稳定:不同的页面运行在不同的进程,一个页面崩溃不会影响另一个页面。插件同理。
- 不流畅:
- 不同的页面运行在不同的进程,对应页面如果卡死,只会影响那一个页面,其他页面则不受影响。
- 同样,一个页面关闭以后,对应的渲染进程就结束了,自然对应的页面就不存在内存泄漏这个问题了。
- 不安全:远程代码都是运行在沙箱环境中,恶意代码就无法执行系统基本的操作。
现代多进程架构
目前的 Chrome 浏览器包含以下部分:
- 1 个浏览器主进程
- 1 个 GPU 进程
- 1 个网络进程
- 多个渲染进程
- 多个插件进程
其中渲染进程和插件进程运行在安全沙箱下。

各个进程的职责
浏览器进程
- 界面显示、用户交互、子进程管理
- 提供存储等功能
渲染进程
- 核心任务是将 HTML、CSS 和 JavaScript 转换为用户可以与之交互的网页
- 排版引擎 Blink 和 JavaScript 引擎 V8 都是运行在该进程中
- 默认情况下,Chrome 会为每个 Tab 标签创建一个渲染进程
GPU 进程
- 绘制 UI 界面
网络进程
- 主要负责页面的网络资源加载
插件进程
- 负责插件的运行
多进程架构的缺点
- 更高资源的占用:相同的模块可能会被创建多个进程,其中一些公共结构是冗余的。
- 更复杂的体系结构:各模块直接耦合性高、可拓展性差。
面向服务的架构
2016 年,Chrome 官方团队使用“面向服务的架构”(Services Oriented Architecture,简称 SOA)的思想设计了新的 Chrome 架构。
原来的各种模块会被重构成独立的服务(Service),每个服务(Service)都可以在独立的进程中运行,访问服务(Service)必须使用定义好的接口,通过 IPC 来通信,从而构建一个更内聚、松耦合、易于维护和扩展的系统,更好实现 Chrome 简单、稳定、高速、安全的目标。
Chrome 还提供灵活的弹性架构,在强大性能设备上会以多进程的方式运行基础服务,但是如果在资源受限的设备上,会将一些服务整合到一个进程中。
- 标题: 【浏览器原理-1】体系结构
- 作者: ObjectKaz
- 创建于: 2021-11-26 14:59:08
- 更新于: 2021-12-27 13:43:36
- 链接: https://www.objectkaz.cn/1c981fb1c673.html
- 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。