从Chrome多进程架构,看懂浏览器“卡而不死”的秘密

84 阅读4分钟

从Chrome多进程架构,看懂浏览器“卡而不死”的秘密

打开Chrome浏览器,你以为只是启动了一个程序?但打开任务管理器一看,它可能悄悄开了十几个进程——这就是现代浏览器的“多进程魔法”。

为什么Chrome要搞这么复杂?IE时代的“单进程噩梦”,或许能给你答案。

一、IE的“单进程陷阱”:一个页面崩,全家跟着躺

早期IE是单进程架构:所有标签页、渲染、JS执行、网络请求,全挤在一个进程里。

就像如图所示:

3.jpg

  • 页面渲染、JS运行、插件逻辑,全塞在“页面线程”里
  • 只要其中一个任务卡住(比如JS死循环),整个浏览器直接“假死”
  • 某一个页面崩溃?不好意思,所有标签页一起关闭,数据全丢

这就是当年用IE时“突然无响应”的根源——单进程等于把所有鸡蛋放在一个篮子里

二、Chrome的“多进程救赎”:每个标签都是独立“小王国”

Chrome把IE的“单进程”拆成了多个独立进程,核心架构包含5类进程:

4.jpg

1. 浏览器主进程:“大管家”

  • 负责:界面显示、用户交互(点击/输入)、子进程管理、本地存储(Cookie/LocalStorage)
  • 地位:整个浏览器的“大脑”,唯一不可替代的进程

2. 渲染进程:每个标签都是“独立王国”

  • 负责:把HTML/CSS/JS变成你看到的网页(Blink排版引擎+V8 JS引擎都在这里)
  • 特点:默认一个标签页对应一个渲染进程——某页面崩了?其他标签页完全不受影响

3. GPU进程:让页面“动”得更丝滑

  • 早期是为了实现3D CSS,现在负责:网页/UI的GPU加速绘制(比如动画、缩放)
  • 显卡直接参与渲染,比CPU渲染快N倍

4. 网络进程:专门“搬资源”

  • 独立负责:所有页面的网络请求(下载图片/JS/CSS)
  • 不用跟渲染抢资源,加载速度更快

5. 插件进程:隔离“危险分子”

  • 负责:Flash、Chrome插件的运行
  • 插件崩溃?只影响自己的进程,浏览器主程序毫发无损

三、多进程的“双面性”:为什么Chrome“内存越用越大”?

Chrome的多进程架构解决了“崩溃/卡顿”问题,但也带来了内存开销大的缺点:

  • 每个进程都要单独占用内存(比如10个标签页=10个渲染进程)
  • 如果进程之间需要进行数据通信,需要通过进程间通信(IPC)机制来实现。

但这是“安全/流畅”换“内存”的取舍——毕竟比起“崩了丢数据”,多占点内存大多数人都能接受。

四、实战:打开一个页面,Chrome到底开了多少进程?

当你打开一个网页(比如掘金),Chrome会启动至少4个进程

5.png

  1. 浏览器主进程(必开)
  2. 该标签页的渲染进程(必开)
  3. 网络进程(负责下载页面资源)
  4. GPU进程(加速页面渲染)

如果装了插件,还会加一个“插件进程”——这就是Chrome任务管理器里总有一堆进程的原因。

五、从“单线程”到“多线程”:任务执行效率的飞跃

除了多进程,Chrome的多线程也在悄悄提升效率:

1.jpg

2.jpg

  • 单线程(进程A):任务1→任务2→任务3→任务4,串行执行,耗时久
  • 多线程(进程B):线程1跑任务1、线程2跑任务2+任务4、线程3跑任务3,并行执行,时间直接减半

而多线程能高效协作,是因为线程共享进程的资源(比如第二张图里,线程1把计算结果“写”到数据区,线程2直接“读”取后显示)。

总结:Chrome的“多进程哲学”

从IE到Chrome,浏览器架构的进化本质是:

用“进程隔离”换“稳定性”,用“资源拆分”换“流畅度”

你可以吐槽Chrome占内存,但不得不承认:

  • 某标签页崩了,其他页面照用不误
  • JS死循环?只卡当前标签,浏览器依然能操作
  • 插件乱搞?直接隔离,不会影响主程序

这正是多进程架构最迷人的地方——每个进程都是一座独立的“安全堡垒”,将崩溃、卡顿等风险牢牢锁在堡垒之内,绝不向外蔓延。

最后考考你:打开Chrome后,按Shift+Esc打开任务管理器,看看你的浏览器开了多少进程?欢迎在评论区晒出你的“Chrome进程数”~