深入解析 Chrome 浏览器的多进程架构:标签页是进程还是线程?(中英双语) ...

打印 上一主题 下一主题

主题 987|帖子 987|积分 2961

深入解析 Chrome 浏览器的多进程架构:标签页是进程还是线程?

1. 引言

Google Chrome 作为全球最流行的浏览器之一,以其稳定性、安全性和多任务处理能力而闻名。而其高效的表现,很洪流平上归功于其独特的多进程架构(Multi-Process Architecture)
许多用户好奇:


  • 每打开一个新的标签页,Chrome 是创建了一个新的进程还是线程?
  • 为什么 Chrome 采用多进程架构,而不是单进程或多线程架构?
  • 底层的进程管理机制是如何实现的?
本文将深入解析 Chrome 浏览器的多进程架构,并探究其底层技术实现。

2. Chrome 的多进程架构

Chrome 采用的是 “多进程 + 多线程” 肴杂架构,即:


  • 差异标签页(Tab)通常运行在差异的进程中(但并不是每个标签页都一定是独立进程)。
  • 每个进程内部仍然可以有多个线程,如:

    • JavaScript 运行的 渲染线程
    • 处理网络请求的 网络线程
    • 处理 UI 的 主线程
    • 实行 WebAssembly 的 WebWorker 线程

2.1 Chrome 的核心进程

Chrome 重要有以下几种进程:
进程类型作用浏览器进程(Browser Process)负责整个浏览器的管理,如 UI、标签页管理、网络请求、用户输入等。渲染进程(Renderer Process)负责渲染 HTML、CSS、JavaScript,实行 JavaScript 代码,每个标签页通常有一个独立的渲染进程。GPU 进程(GPU Process)负责 GPU 硬件加速,减少 CPU 计算压力。插件进程(Plugin Process)运行 Flash、PDF 等插件,防止插件崩溃影响整个浏览器。扩展进程(Extension Process)运行 Chrome 插件(Extensions),包管扩展的独立性。
3. Chrome 采用多进程架构的原因

为什么 Chrome 选择多进程架构,而不是传统的单进程或多线程架构?重要有以下几个原因:
3.1 可靠性(Stability)



  • 在传统单进程浏览器(如早期的 Internet Explorer)中,假如一个标签页崩溃,整个浏览器都会崩溃
  • 多进程架构使得一个标签页崩溃不会影响其他标签页,提高了稳定性。
3.2 安全性(Security)



  • Chrome 采用 沙盒机制(Sandboxing),限制渲染进程的权限,使其无法访问操纵系统的关键资源,防止恶意网站利用浏览器漏洞攻击系统。
  • 假如 JavaScript 触发了恶意代码,它只能影响当前的渲染进程,而不会影响整个浏览器
3.3 性能优化(Performance)



  • 多进程架构可以更好地利用多核 CPU,提高并行处理能力。
  • 独立的 GPU 进程 负责图像渲染,提高了页面的绘制速率,减少了 CPU 负担。
3.4 资源隔离(Resource Isolation)



  • 每个渲染进程都有独立的内存空间,防止一个页面的内存泄漏影响其他页面。
  • 传统单进程浏览器中,假如某个网站占用大量内存,整个浏览器大概会卡顿乃至崩溃,而 Chrome 采用多进程可以防止这种情况。

4. Chrome 是如何管理进程的?

Chrome 的进程管理由 Site Isolation(站点隔离)策略 以及 进程模子 控制。
4.1 进程管理策略

Chrome 采用了多种进程管理策略,重要包括:

  • 每个站点(Site)一个进程(Site Isolation)

    • 差异的站点运行在差异的渲染进程中,防止跨站点攻击。
    • 例如:
      1. 打开 https://example.com → 运行在一个渲染进程
      2. 打开 https://google.com → 运行在另一个渲染进程
      复制代码

  • 同一站点的多个标签页可以共享进程

    • 例如,用户打开多个 https://example.com 的页面时,它们大概共享同一个渲染进程,减少内存占用。

  • 后台标签页大概会被“冻结”

    • Chrome 大概会暂停不生动的标签页进程,以减少 CPU 和内存斲丧。


5. clone() 在 Chrome 进程管理中的应用

Chrome 采用 Linux clone() 系统调用 来创建新进程,而不是传统的 fork()。
可以参考笔者的另一篇博文:深入解析 clone():高效的进程与线程创建方法(中英双语)
5.1 为什么 Chrome 使用 clone() 取代 fork()?



  • clone() 答应 创建共享资源的进程,而 fork() 复制整个地点空间,开销较大。
  • clone() 答应 灵活地选择共享哪些资源(如内存、文件描述符、信号处理等)。
5.2 Chrome 创建进程的底层实现

当 Chrome 需要创建一个新的渲染进程时,它会调用 clone():
  1. #define _GNU_SOURCE
  2. #include <sched.h>
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5. #include <unistd.h>
  6. #define STACK_SIZE 1024 * 1024  // 1MB stack
  7. int child_func(void *arg) {
  8.     printf("Chrome Renderer Process: PID = %d\n", getpid());
  9.     return 0;
  10. }
  11. int main() {
  12.     char *stack = malloc(STACK_SIZE);
  13.     if (!stack) {
  14.         perror("malloc");
  15.         exit(EXIT_FAILURE);
  16.     }
  17.     pid_t pid = clone(child_func, stack + STACK_SIZE, CLONE_VM | CLONE_FS | CLONE_FILES | CLONE_SIGHAND | SIGCHLD, NULL);
  18.     if (pid == -1) {
  19.         perror("clone");
  20.         exit(EXIT_FAILURE);
  21.     }
  22.     printf("Chrome Main Process: PID = %d, Renderer PID = %d\n", getpid(), pid);
  23.     wait(NULL);
  24.     free(stack);
  25.     return 0;
  26. }
复制代码
解释:


  • CLONE_VM 让子进程共享内存(避免 fork() 复制数据)。
  • CLONE_FS 共享文件系统信息(减少 I/O 资源)。
  • CLONE_FILES 共享文件描述符(如 sockets)。
  • CLONE_SIGHAND 共享信号处理机制

6. 结论

回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

慢吞云雾缓吐愁

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表