架构
浏览器核心组件
现代浏览器是复杂的软件系统,通常由以下几个核心组件构成:
用户界面(User Interface)
- 包括地址栏、前进/后退按钮、书签菜单等
- 除了网页窗口显示区域外的所有部分
- 负责与用户直接交互的界面元素
浏览器引擎(Browser Engine)
- 在用户界面和渲染引擎之间传送指令
- 协调UI和渲染进程之间的活动
- 处理高级操作,如前进/后退/刷新
渲染引擎(Rendering Engine)
- 负责显示请求的内容
- 解析HTML和CSS
- 布局和绘制网页内容
- 不同浏览器使用不同的渲染引擎
网络(Networking)
- 处理网络调用和请求
- 实现各种网络协议(HTTP/HTTPS/FTP等)
- 管理连接池和缓存
JavaScript引擎(JavaScript Engine)
- 解析和执行JavaScript代码
- 包含解释器、编译器和优化器
- 管理内存分配和垃圾回收
UI后端(UI Backend)
- 绘制基本的窗口小部件,如组合框和窗口
- 使用操作系统的用户界面方法
- 提供平台无关的接口
数据存储(Data Storage)
- 持久层,保存各种数据
- 管理Cookie、LocalStorage、IndexedDB等
- 提供文件系统访问
主流浏览器内核
浏览器 | 渲染引擎 | JavaScript引擎 | 备注 |
---|---|---|---|
Chrome | Blink | V8 | 2013年从WebKit分支 |
Firefox | Gecko | SpiderMonkey | 最早的JavaScript引擎 |
Safari | WebKit | JavaScriptCore | Apple开发的WebKit |
Edge | Blink | V8 | 2019年后采用Chromium内核 |
Opera | Blink | V8 | 2013年后采用Chromium内核 |
IE | Trident | Chakra | 已停止维护 |
浏览器多进程架构
现代浏览器采用多进程架构以提高稳定性、安全性和性能。以Chrome为例:
主要进程类型
浏览器进程(Browser Process)
- 控制浏览器的主用户界面
- 管理标签页和插件
- 处理用户权限(如下载请求)
- 协调其他进程
渲染进程(Renderer Process)
- 每个标签页通常都有自己的渲染进程
- 负责标签页内网页的渲染
- 运行JavaScript和处理DOM
- 在沙箱环境中运行,提高安全性
插件进程(Plugin Process)
- 运行浏览器插件(如Flash)
- 隔离插件代码,防止影响浏览器稳定性
GPU进程(GPU Process)
- 处理GPU任务,加速渲染
- 跨标签页共享
网络进程(Network Process)
- 处理网络请求
- 实现网络栈
- 管理HTTP缓存
存储进程(Storage Process)(较新版本)
- 管理浏览器的数据存储
- 处理文件系统访问
多进程架构的优势
稳定性提升
- 一个标签页崩溃不会影响整个浏览器
- 进程隔离避免资源冲突
安全性增强
- 沙箱限制渲染进程的系统访问权限
- 进程间通信受到控制
性能优化
- 多核CPU上可并行处理
- 内存占用虽然增加,但可实现更精细的资源管理
进程间通信(IPC)
浏览器进程之间通过IPC(进程间通信)机制进行交互:
- 使用消息传递模式
- 通过共享内存传输大块数据
- 实现通信频道进行请求/响应模式
现代浏览器架构发展趋势
服务化(Service-oriented Architecture)
- Chrome正在将浏览器功能拆分为独立服务
- 每个服务可以在不同进程中运行
- 允许更灵活的资源分配
站点隔离(Site Isolation)
- 不同站点在不同渲染进程中运行
- 更严格的跨源边界
- 缓解类似Spectre的侧信道攻击
进程模型优化
- 在低内存设备上合并进程
- 在高性能设备上使用更多进程
- 动态调整进程分配
WebAssembly沙箱
- 更细粒度的代码隔离
- 提高性能的同时保持安全性
不同浏览器架构比较
Chrome (Chromium)
- 最复杂的多进程架构
- 高度模块化,进程隔离最彻底
- 内存占用较高
Firefox
- 多进程模型(称为Electrolysis或e10s)
- 内容进程比Chrome少,更节省内存
- 使用Fission项目实现站点隔离
Safari
- 分离的UI进程和Web内容进程
- 强调能效和电池寿命
- 较少的进程数量,但隔离度较低
Edge (Chromium-based)
- 继承Chrome的多进程架构
- 微软增加了一些特有的安全功能
- 增强了企业部署和管理功能