Chrome浏览器多进程架构3个必会知识点
本文章是基于Chrome浏览器学习浏览器的多进程架构,因为其它大部分主流浏览器都是基于Chromium二次开发,所以其具有代表性。
打开一个页面需要启动多少进程?
通过点击Chrome浏览器右上角的【选项】菜单,选择【更多工具】,选择【任务管理器】,可以看到存在的进程信息如下:
那打开一个页面需要启动6个进程?其实不是的,图片里的扩展程序:cross-request这个是我本机安装的用于处理跨域的扩展程序,所以也占用了进程;实用程序:Audio Service是用于处理音频的,也并非是一定要使用的。
所以实际上,打开一个页面基本要使用到的进程配比是这样的:
1个浏览器进程+1个GPU进程+1个网络进程+多个渲染进程(非同站点tab)+多个插件进程
几个进程各自作用如下:
浏览器主进程
主要负责界面显示、用户交互、子进程管理,同时提供存储等功能
GPU进程
GPU进程起初是用来实现3D CSS的效果,而一开始chrome浏览器也并没有GPU进程。随之网页、Chrome的UI界面都选择采用GPU来绘制,这使得GPU成为浏览器的普遍需求。最后Chrome浏览器在其多进程架构上也引入了GPU进程。
网络进程
主要是负责页面的网络资源加载。
渲染进程
核心任务是将HTML、CSS和JavaScript转换为用户可以与之交互的网页,排版引擎Blink和JavaScript引擎V8都是运行在该进程中,默认情况下,Chrome会为每个Tab标签创建一个渲染进程。出于安全考虑,渲染进程都是运行在沙箱模式下。
插件进程
主要是负责插件的运行,因插件容易崩溃,所以需要插件进程来隔离,以保证插件进行崩溃不会对浏览器和页面造成影响。
当然页面如果存在iframe的话,iframe也会运行在单独的进程中。
为何浏览器要使用多进程架构设计?
为了让浏览器更稳定、流畅和安全。
起初浏览器的所有功能模块都是运行在同一个进程中,模块中包含了JavaScript运行环境、渲染引擎、插件等,这种架构设计的浏览器也称为单进程浏览器。单进程浏览器也暴露了很多问题:
不稳定性。早期浏览器web游戏等需要借助插件来实现,然而插件是不稳定的模块,且运行在浏览器进程中,一旦崩溃,会导致整个浏览器崩溃。渲染引擎模块也是如此,复杂的JavaScript代码也可能导致问题。
不流畅性。单进程浏览器中的功能模块运行在同一线程中,同一时刻只能执行一个功能模块。那倘若JavaScript引擎执行了无限循环的脚本,其他功能就没有被执行的机会。浏览器便会卡顿,失去响应。当然插件也会导致单进程浏览器卡顿、页面的内存泄露也是单进程变慢的原因。
不安全性。首先插件是通过C/C++等语言编写,通过插件能够获取操作系统资源,其次页面JavaScript脚本,也可以通过浏览器漏洞获取系统权限,此两种方式均可攻击电脑,引发安全问题。
多进程架构浏览器针对以上问题,做了如下调整:
针对不稳定性,因为采用了多进程架构设计,各进程之间是相互独立的,进程之间是通过IPC机制进行通信。因此当诸如插件或者页面崩溃,影响的只是当前进程,并不会影响其他进程,所以也就不会导致浏览器崩溃。
不流畅性。JavaScript只是运行在渲染进程,每打开一个非同站点tab页面,则创建一个新的渲染进程,所以当某个JavaScript阻塞了渲染进程,仅会影响当前tab页,不会影响其他tab页和浏览器。
当页面内存泄露,则关闭当前tab页面,渲染进程也就关闭,进程所占用的内存都会被系统回收。这也就解决了内存泄露导致页面卡顿的问题。
解决安全性。多进程架构的好处是引入了安全沙箱。 可以把沙箱看成是操作系统给进程上了一把锁,沙箱里的程序可以运行,但是不能在硬盘上写入或者读取数据。而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