IT评测·应用市场-qidao123.com
标题:
深入解析 Chrome 浏览器的多进程架构:标签页是进程还是线程?(中英双语)
[打印本页]
作者:
慢吞云雾缓吐愁
时间:
2025-2-21 10:52
标题:
深入解析 Chrome 浏览器的多进程架构:标签页是进程还是线程?(中英双语)
深入解析 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)
差异的站点运行在差异的渲染进程中
,防止跨站点攻击。
例如:
打开 https://example.com → 运行在一个渲染进程
打开 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():
#define _GNU_SOURCE
#include <sched.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#define STACK_SIZE 1024 * 1024 // 1MB stack
int child_func(void *arg) {
printf("Chrome Renderer Process: PID = %d\n", getpid());
return 0;
}
int main() {
char *stack = malloc(STACK_SIZE);
if (!stack) {
perror("malloc");
exit(EXIT_FAILURE);
}
pid_t pid = clone(child_func, stack + STACK_SIZE, CLONE_VM | CLONE_FS | CLONE_FILES | CLONE_SIGHAND | SIGCHLD, NULL);
if (pid == -1) {
perror("clone");
exit(EXIT_FAILURE);
}
printf("Chrome Main Process: PID = %d, Renderer PID = %d\n", getpid(), pid);
wait(NULL);
free(stack);
return 0;
}
复制代码
解释:
CLONE_VM 让子进程
共享内存
(避免 fork() 复制数据)。
CLONE_FS 共享
文件系统信息
(减少 I/O 资源)。
CLONE_FILES 共享
文件描述符
(如 sockets)。
CLONE_SIGHAND 共享
信号处理机制
。
6. 结论
欢迎光临 IT评测·应用市场-qidao123.com (https://dis.qidao123.com/)
Powered by Discuz! X3.4