写点什么

Chrome 浏览器多进程架构 3 个必会知识点

用户头像
梁龙先森
关注
发布于: 2021 年 02 月 14 日
Chrome浏览器多进程架构3个必会知识点

本文章是基于 Chrome 浏览器学习浏览器的多进程架构,因为其它大部分主流浏览器都是基于 Chromium 二次开发,所以其具有代表性。

打开一个页面需要启动多少进程?

通过点击 Chrome 浏览器右上角的【选项】菜单,选择【更多工具】,选择【任务管理器】,可以看到存在的进程信息如下:

那打开一个页面需要启动 6 个进程?其实不是的,图片里的扩展程序:cross-request 这个是我本机安装的用于处理跨域的扩展程序,所以也占用了进程;实用程序:Audio Service 是用于处理音频的,也并非是一定要使用的。

所以实际上,打开一个页面基本要使用到的进程配比是这样的:

1 个浏览器进程+1 个 GPU 进程+1 个网络进程+多个渲染进程(非同站点 tab)+多个插件进程

几个进程各自作用如下:

  1. 浏览器主进程

主要负责界面显示、用户交互、子进程管理,同时提供存储等功能

  1. GPU 进程

GPU 进程起初是用来实现 3D CSS 的效果,而一开始 chrome 浏览器也并没有 GPU 进程。随之网页、Chrome 的 UI 界面都选择采用 GPU 来绘制,这使得 GPU 成为浏览器的普遍需求。最后 Chrome 浏览器在其多进程架构上也引入了 GPU 进程。

  1. 网络进程

主要是负责页面的网络资源加载。

  1. 渲染进程

核心任务是将 HTML、CSS 和 JavaScript 转换为用户可以与之交互的网页,排版引擎 Blink 和 JavaScript 引擎 V8 都是运行在该进程中,默认情况下,Chrome 会为每个 Tab 标签创建一个渲染进程。出于安全考虑,渲染进程都是运行在沙箱模式下。

  1. 插件进程

主要是负责插件的运行,因插件容易崩溃,所以需要插件进程来隔离,以保证插件进行崩溃不会对浏览器和页面造成影响。


当然页面如果存在 iframe 的话,iframe 也会运行在单独的进程中。

为何浏览器要使用多进程架构设计?

为了让浏览器更稳定、流畅和安全

起初浏览器的所有功能模块都是运行在同一个进程中,模块中包含了 JavaScript 运行环境、渲染引擎、插件等,这种架构设计的浏览器也称为单进程浏览器。单进程浏览器也暴露了很多问题:

  1. 不稳定性。早期浏览器 web 游戏等需要借助插件来实现,然而插件是不稳定的模块,且运行在浏览器进程中,一旦崩溃,会导致整个浏览器崩溃。渲染引擎模块也是如此,复杂的 JavaScript 代码也可能导致问题。

  2. 不流畅性。单进程浏览器中的功能模块运行在同一线程中,同一时刻只能执行一个功能模块。那倘若 JavaScript 引擎执行了无限循环的脚本,其他功能就没有被执行的机会。浏览器便会卡顿,失去响应。当然插件也会导致单进程浏览器卡顿、页面的内存泄露也是单进程变慢的原因。

  3. 不安全性。首先插件是通过 C/C++等语言编写,通过插件能够获取操作系统资源,其次页面 JavaScript 脚本,也可以通过浏览器漏洞获取系统权限,此两种方式均可攻击电脑,引发安全问题。

多进程架构浏览器针对以上问题,做了如下调整:

  1. 针对不稳定性,因为采用了多进程架构设计,各进程之间是相互独立的,进程之间是通过 IPC 机制进行通信。因此当诸如插件或者页面崩溃,影响的只是当前进程,并不会影响其他进程,所以也就不会导致浏览器崩溃。

  2. 不流畅性。JavaScript 只是运行在渲染进程,每打开一个非同站点 tab 页面,则创建一个新的渲染进程,所以当某个 JavaScript 阻塞了渲染进程,仅会影响当前 tab 页,不会影响其他 tab 页和浏览器。

当页面内存泄露,则关闭当前 tab 页面,渲染进程也就关闭,进程所占用的内存都会被系统回收。这也就解决了内存泄露导致页面卡顿的问题。

  1. 解决安全性。多进程架构的好处是引入了安全沙箱。可以把沙箱看成是操作系统给进程上了一把锁,沙箱里的程序可以运行,但是不能在硬盘上写入或者读取数据。而 Chrome 把插件进程和渲染进程锁在安全沙箱,因此也就防止了恶意程序对系统的伤害。

多进程架构浏览器为何仍会由于单页面卡死导致所有页面崩溃?

通常情况下是一个页面使用一个渲染进程,但若从一个页面打开了新页面,且新页面和当前页面属于“同一站点”,则新开页面会复用父页面的渲染进程,这是 chrome 浏览器的默认策略,官方叫法为:process-per-site-instance。

那什么属于同一站点呢?

定义是这样的:将根域名加上协议,还包含了该根域名下的所有子域名和不同的端口归于同一站点。属于同一站点,则几个页面共享一个渲染进程,也将会共享 JavaScript 的执行环境,此时父页面也能够在子页面直接执行脚本。同一站点例如:

// 跟域名:abc.com  协议:httpshttps://www.abc.comhttps://abc.comhttps://xx.abc.com// 以上3个属于同一站点
复制代码

因此,当多个页面属于同一站点,共享一个渲染进程,当某个页面崩溃的时候,也将导致同一站点的其他页面也崩溃。


发布于: 2021 年 02 月 14 日阅读数: 32
用户头像

梁龙先森

关注

脚踏V8引擎的无情写作机器 2018.03.17 加入

还未添加个人简介

评论

发布
暂无评论
Chrome浏览器多进程架构3个必会知识点