浏览器是一个多进程多线程的,类似于操作系统的。
浏览器的进程模型决定了如何管理和分隔浏览器的各个组件,以提供更好的性能、安全性和稳定性。主要的进程模型包括单进程模型、多进程模型和混合进程模型。
1. 单进程模型
在单进程模型中,浏览器的所有组件(包括用户界面、渲染引擎、插件、网络处理等)都运行在一个进程中。
优点:
内存占用相对较少,因为所有组件共享一个进程。
进程间通信开销低。
缺点:
稳定性差,如果任何一个组件崩溃,整个浏览器都会崩溃。
安全性差,所有组件共享同一个地址空间,恶意插件或脚本更容易影响浏览器的其他部分。
性能受限,单个进程难以充分利用多核CPU的优势。
2. 多进程模型
多进程模型将浏览器的不同组件分隔到多个独立的进程中,例如:一个主浏览器进程(管理用户界面、插件、网络请求等)多个渲染进程(每个标签页或一组标签页一个渲染进程)
独立的插件进程
优点:
稳定性高,一个渲染进程崩溃不会影响其他标签页或浏览器主进程。
安全性高,进程之间的隔离使得恶意代码难以跨进程攻击。
性能更好,多个渲染进程可以并行工作,充分利用多核CPU。
缺点:
内存占用较高,每个进程有独立的内存空间和资源。
进程间通信开销较大,特别是在需要频繁通信的情况下。
3. 混合进程模型
混合进程模型结合了单进程模型和多进程模型的优点。通常是根据需求和资源情况来动态调整进程的数量和类型。浏览器会在某些情况下使用共享的渲染进程,以减少内存消耗,同时在其他情况下使用独立的渲染进程以提高稳定性和安全性。
Chrome采用了多进程模型,每个标签页、插件和扩展都运行在独立的进程中。此外,Chrome还有一个主浏览器进程来管理所有的渲染进程。
Firefox最初是单进程模型,但从Firefox 54开始,逐步引入了多进程架构(称为“Electrolysis”或“e10s”)。现在,Firefox使用一个主进程、多个渲染进程和多个插件进程。
Edge是Chrome类似的多进程模型。
Chrome 包含哪些主要的进程:
- 浏览器进程(Browser Process)这是主进程,负责管理和协调其他进程的工作。浏览器进程主要处理:
- 用户界面(UI):如地址栏、书签、工具栏等。
- 网络请求:处理所有的网络请求,并将数据传递给适当的渲染进程。
- 文件访问:管理对本地文件系统的访问。
- 数据存储:包括书签、历史记录、Cookie 等的管理。
- 插件进程的管理和维护。
- 渲染进程(Renderer Process)渲染进程负责呈现网页内容。这是 Chrome 进程模型的核心部分,主要功能包括:
- HTML、CSS 和 JavaScript 的解析和执行。
- DOM 树的构建和布局计算。
- 图像和视频的解码和渲染。
- 每个标签页通常使用一个独立的渲染进程,确保一个标签页崩溃不会影响其他标签页。(计划改进:从一个标签页一个进程改为一个站点一个进程;)
- 插件进程(Plugin Process)插件进程负责处理浏览器中的所有插件。常见的插件包括 Flash、Java 等。独立的插件进程提供了额外的安全层次,如果一个插件崩溃或被攻击,不会影响浏览器的其余部分。
- GPU 进程(GPU Process)GPU 进程负责处理图形渲染任务。它将图形密集型的工作从渲染进程中解放出来,以提高图形渲染的性能和整体浏览体验。具体功能包括:
- 加速 2D 和 3D 图形渲染。
- 处理视频解码任务。
- 支持 WebGL 和硬件加速的 CSS。
- 网络服务进程(Network Service Process)网络服务进程是一个专门处理所有网络相关任务的进程。它负责处理网络请求、Cookie 管理、缓存等。网络服务进程的独立化使得网络相关的任务更加高效和安全。
- 实用进程(Utility Process)实用进程是一个通用进程,负责处理各种辅助任务,例如 PDF 解析、数据转换等。它提供了额外的隔离和安全性,确保这些任务不会影响主要的渲染和浏览器进程。
- 扩展进程(Extension Process)扩展进程用于处理 Chrome 浏览器的扩展。每个扩展通常运行在一个独立的进程中,以确保扩展的崩溃或性能问题不会影响浏览器的其他部分。
- 沙盒(Sandboxing)虽然沙盒不是一种具体的进程,但它是 Chrome 安全模型的重要组成部分。沙盒机制通过严格的权限隔离,限制每个进程(尤其是渲染进程和插件进程)的操作范围,防止恶意代码和漏洞利用扩散到系统的其他部分。
Chrome:渲染进程如何工作
-
接收和解析数据
当浏览器进程从网络获取到 HTML 文档后,它会将这些数据传递给渲染进程。渲染进程接收 HTML 数据并开始解析。 -
构建 DOM 树
HTML 解析器(HTML Parser)逐行解析 HTML 标记,构建文档对象模型(DOM)树。DOM 树是 HTML 文档的树状表示,每个节点对应一个 HTML 元素。 -
构建 CSSOM 树
渲染进程还会解析所有的 CSS 文件和内联样式,构建 CSS 对象模型(CSSOM)树。这棵树表示所有样式规则及其应用的方式。 -
合并 DOM 和 CSSOM 树为渲染树
DOM 树和 CSSOM 树会合并成渲染树(Render Tree)。渲染树包含了需要显示在屏幕上的所有节点及其样式。不可见的节点(例如 head 或 display: none 的元素)不会在渲染树中。 -
布局(Layout)
渲染树构建完成后,渲染进程会计算每个节点在屏幕上的确切位置和尺寸,这个过程称为布局(或排版,Layout)。布局从根节点开始,递归计算每个节点的大小和位置。 -
绘制(Painting)
布局完成后,渲染树的每个节点会被转换成屏幕上的实际像素,这个过程称为绘制(Painting)。绘制分多个步骤完成,包括绘制文本、颜色、边框、阴影等。 -
合成层(Compositing Layers)
复杂的页面可能包含多个重叠元素、动画、3D 变换等。渲染进程会将这些元素分成多个合成层(Compositing Layers),并分别绘制每个层。每个层会被绘制到一个独立的位图中。 -
合成和显示
绘制完成后,合成器线程(Compositor Thread)会将所有位图合成到一起,生成最终的页面图像,并通过 IPC 将其发送给浏览器进程。浏览器进程会将这些图像显示在屏幕上。