阅读 115

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  协议:https
https://www.abc.com
https://abc.com
https://xx.abc.com
// 以上3个属于同一站点复制代码

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


作者:梁龙先森
链接:https://juejin.cn/post/7027800125225304094


文章分类
代码人生
版权声明:本站是系统测试站点,无实际运营。本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 XXXXXXo@163.com 举报,一经查实,本站将立刻删除。
相关推荐