[译]深入了解现代web浏览器(一)
本文是根据Mariko Kosaka在谷歌开发者网站上的系列文章https://developer.chrome.com/blog/inside-browser-part1/ 翻译而来,共有四篇,该篇是第一篇。对于其中一些直译出来不太好理解的句子,笔者做了加工处理和提炼。
CPU,GPU,内存和多进程架构
在这四篇博客系列中,我们将从高层架构到渲染管线来深入了解Chrome浏览器。如果你想知道浏览器是如何将你的代码转换为一个功能性网站、又或者不太确定为什么一些技术点能用来提高性能,那么这个系列正适合你。
在这个系列的第一篇中,我们将了解到计算机核心计算模块的术语以及Chrome浏览器的多进程架构。
计算机的核心——CPU和GPU
为了理解浏览器的运行环境,我们需要先理解一些计算机部件以及它们是如何运作的。
CPU
首先是中央处理器 - 也被称为CPU。CPU就如同计算机的大脑。在下图中,一个CPU内核就像是一个工作人员,可以处理一个接一个过来的各种任务,从数学计算到艺术工作都能胜任,并且还知道如何回复给客户。在过去,绝大部分CPU都是单芯片的;内核就像另一个CPU驻留在同一芯片中。在现代硬件中,为了让你的手机和电脑拥有更强的算力,通常都是多核的。

GPU
图形处理器——GPU是计算机的另一个重要组成部件。不同于CPU,GPU擅长处理简单的任务但是能同时跨越多个核。顾名思义,它最初是被设计来处理图形任务的,为了能够更快速地渲染和更流畅地交互。近些年来,随着GPU加速计算的发展,使得越来越多的计算任务能够放到GPU上处理。

当你启动计算机或者手机上的应用程序时,CPU和GPU就会驱动你的程序运行。通俗地说,应用程序是使用操作系统提供的各种机制从而才能运行在CPU和GPU上:

三层架构:底部是硬件,中间是操作系统,最上层是应用程序
在进程和线程上执行程序
在深入了解浏览器架构前需要掌握的另一个重要概念是进程和线程。进程可以被描述为一个应用的执行程序,一个线程是位于进程之中的并且会执行进程中的某部分程序。

把进程比作一个密封的盒子,线程就像是抽象的鱼在其中游动
当你启动一个应用程序的时候,一个进程也会被创建出来。该进程可能会创建一个或多个线程来帮助完成工作。操作系统会给进程分配“一整块”的内存来让其工作并将应用程序的状态都存储在该私有的内存空间中。当你关闭应用时,进程就会消失,之后操作系统就会将该块内存释放掉。示意动画:
进程可以请求操作系统启动另一个进程来运行不同的任务;这种情况下,新启动的进程会被分配新的一块内存。如果两个进程想要通信,可以使用一项被称为“进程间通信”(IPC)的技术手段。有许多应用程序都是这么设计的,因此当其中一个工作进程无响应时,可以依靠其他的进程来进行重启。
不同进程通过IPC进行通信
浏览器架构
那么浏览器是如何通过进程和线程构建起来的呢?如下图所示,它可能是仅有一个进程和多个线程构建的,也可以是通过多个进程且进程之中还都有多个线程的方式构建,进程之间通过IPC来通信:

需要注意的一点是,上述不同架构是实现上的细节;并没有所谓的规范规定浏览器应该如何构建。不同浏览器之间的实现差异可能很大。
在本系列的文章中,我们将使用下图中描述的Chrome浏览器的最新架构。(这里注意下 原文是2018年发布的了)
顶部的浏览器进程是专门用来与其他处理应用程序不同部分的进程做协调的。对于渲染进程,会创建出多个并分配给每个tab页。在最近Chrome打算在可能的情况下给每个站点分配一个进程,包括iframe。

Chrome的多进程架构。在渲染进程之下显示有多个层,表示Chrome为每个tab页都运行有一个渲染进程
各个进程都分别控制什么内容?
下方的表格展示了Chrome中各个进程和其控制的内容:
| 进程 | 控制的内容 |
|---|---|
| 浏览器进程 | 控制Chrome应用程序的部分模块,例如地址栏、书签、前进和后退按钮。同时也web浏览器中一些不可见和需要特定权限的功能,例如网络请求和文件访问 |
| 渲染进程 | 控制展示在网页中的所有内容 |
| 插件进程 | 控制网页所使用的任何插件,例如flash |
| GPU进程 | 独立于其他的进程。在这种设计下,GPU进程接收来自其他进程的请求并最终都绘制在同一界面上 |

不同进程指向浏览器UI的不同部分
还有一些其他进程例如拓展进程和公用辅助进程。如果你想知道在你的Chrome中运行着哪些进程,可以点击右上角的菜单栏 -> 更多工具 -> 任务管理器。然后会打开一个窗口,展示当前正在运行的进程列表以及它们占用了多少的CPU和内存等资源。
Chrome多进程架构的好处
前面我们提到过Chrome是使用多个渲染进程的。在绝大多数简单的场景下,你可以认为每个tab有自己单独的渲染进程。现在假设你打开了3个tab页并且每个tab页运行着独立的渲染进程。如果其中一个无响应了,你可以关闭无响应的那个tab页,而其他的tabs依然正常运行。但是如果所有tabs都运行在一个进程中的话,当某一个tab页无响应时,所有的tabs都将会无响应,这真的太糟糕了。

把浏览器的工作分发到各个进程中的另一个好处是安全性和沙盒化。因为操作系统提供了限制进程权限的方式,浏览器可以利用沙盒化保护一些特定功能的进程。比如,Chrome限制了各种处理用户输入的进程(像渲染进程),不能随意地访问文件。
由于进程都有各自私有的内存空间,所以它们通常都会包含公共基础设施的副本(例如Chrome的js引擎-V8)。这意味着需要消耗更多的内存,因为它们没法像同一进程中的线程那样共享。为了节省内存,Chrome限制了可以启动的进程数量。这个限制取决于设备的CPU和内存;当Chrome达到限制时,它会开始在一个进程中运行来自同一站点的多个tab页。
节省更多内存——Chrome中的服务化
上节中最后一段的方法也适用于浏览器进程。Chrome正在经历更改,以将浏览器程序的各个部分作为服务运行,从而能够轻松地拆分为不同进程或者聚合为一个。
一般的想法是,当Chrome运行在高性能的硬件上时,它可能会将每个服务拆分为不同的进程以提供更高的稳定性。但在资源受限制的设备上时,Chrome会将服务整合到一个进程中以节省内存占用。在此更改之前,这种整合进程以节省内存使用的方法已经在Android等平台上使用了。
Chrome服务化示意图 将不同的服务移动到多个进程或者单个浏览器进程中
每个frame一个渲染进程——站点隔离
站点隔离是Chrome最近引入的一项功能,它为每个跨站点iframe运行单独的渲染进程。我们前面讨论的模型都是一个tab页运行一个渲染进程,那样便允许跨站点iframe运行在同一渲染进程中,不同站点间就可以共享内存空间。在同一渲染进程中运行a.com和b.com看起来没什么问题。同源策略是网络安全的核心机制;它确保一个站点在未经允许的情况下不能访问其他站点的数据。安全攻击的核心目标就是绕过该策略。随着Meltdown and Spectre问题的出现,使用进程来隔离站点变得更加有必要。自Chrome 67起,在PC端上默认启用站点隔离,tab页中的每个跨站点iframe都会有单独的渲染进程。

站点隔离示意图 指向站点内iframe的多个渲染进程
启用站点隔离是一项持续了多年的大工程。站点隔离并不像分配不同的渲染进程那么简单;它从根本上改变了iframe互相通信的方式。在一个有若干iframe运行在不同进程中的页面上打开devtools,意味着devtools必须做许多幕后工作来使得这一切看起来是无缝相连的。即使是在页面上简单地按下Ctrl + F来查到单词,也需要在多个渲染进程间搜索。这也是为什么浏览器工程师们将站点隔离的发布看做是一项重大的里程碑!
总结
在这篇文章中,我们从高层次的视角介绍了浏览器架构以及多进程架构的好处;还介绍了与多进程架构密切相关的服务化和站点隔离。在下一篇文章中,我们会深入探讨这些进程和线程为了展示一个网页都干了哪些事。
[译]深入了解现代web浏览器(一)的更多相关文章
- C#实现多级子目录Zip压缩解压实例 NET4.6下的UTC时间转换 [译]ASP.NET Core Web API 中使用Oracle数据库和Dapper看这篇就够了 asp.Net Core免费开源分布式异常日志收集框架Exceptionless安装配置以及简单使用图文教程 asp.net core异步进行新增操作并且需要判断某些字段是否重复的三种解决方案 .NET Core开发日志
C#实现多级子目录Zip压缩解压实例 参考 https://blog.csdn.net/lki_suidongdong/article/details/20942977 重点: 实现多级子目录的压缩, ...
- [译]介绍一下渐进式 Web App(即时加载) - Part 2
在上一篇,介绍一下渐进式 Web App(离线) - Part 1的文章中,我们讨论了典型的pwa应该是什么样子的并且同时也介绍了 server worker.到目前为止,我们已经缓存了应用壳.在 i ...
- 后台启动weblogic成功后,在web浏览器上无法访问
后台启动weblogic成功后,在web浏览器上无法访问,可尝试重启服务器.
- shellinabox基于web浏览器的终端模拟器
1. Shellinabox介绍 Shellinabox 是一个利用 Ajax 技术构建的基于 Web 浏览器的远程终端模拟器,也就是说安装了该软件之后,服务器端不需要开启 ssh服务,通过 Web ...
- React Native 项目运行在 Web 浏览器上面
React Native 的出现,让前端工程师拥有了使用 JavaScript 编写原生 APP 的能力.相比之前的 Web app 来说,对于性能和用户体验提升了非常多. 但是 React Nati ...
- 第十一章:WEB浏览器中的javascript
客户端javascript涵盖在本系列的第二部分第10章,主要讲解javascript是如何在web浏览器中实现的,这些章节介绍了大量的脚本宿主对象,这些对象可以表示浏览器窗口.文档树的内容.这些章节 ...
- ASP.NET CORE Web浏览器和Web服务器
//web浏览器 //浏览器本质的原理:浏览器向服务器发请求,服务器把请求的内容返回给浏览器,然后浏览器把返回的内容绘制成一个图形化的界面 //Socket一种通讯交流的技术 //qq用户把信息通过s ...
- [C# 网络编程系列]专题四:自定义Web浏览器
转自:http://www.cnblogs.com/zhili/archive/2012/08/24/WebBrowser.html 前言: 前一个专题介绍了自定义的Web服务器,然而向Web服务器发 ...
- JavaScript 客户端JavaScript之 Web浏览器的环境
Web浏览器实现的Javascript,通过Web浏览器实现的JavaScript引入了大量可脚本化的对象(1.Web浏览器 2.HTML 3.HTML中的内容) Web浏览器中的Javascrip ...
- cookie是指web浏览器存储的少量数据,该数据会在每次请求一个相关的URL时自动传到服务器中(转)
基本概念:cookie是指web浏览器存储的少量数据,该数据会在每次请求一个相关的URL时自动传到服务器中. 以博客园为例,我们看看cookie有哪些属性: 1.Name:cookie的名称: 2.V ...
随机推荐
- 推理实践丨如何使用MindStudio进行Pytorch模型离线推理
摘要:本教程所示例的任务是Ascend Pytorch离线推理,即对给定的已经训练好的模型参数和推理脚本,在Ascend 310/710和Tesla设备上进行推理应用. 本文分享自华为云社区<使 ...
- Mac Maven环境变量配置 zsh: command not found: mvn
之前配过环境变量,但是后来打开还是报 zsh: command not found: mvn 需要在运行前先刷下环境变量 source ~/.bash_profile 每次使用前都刷一下比较麻烦,这是 ...
- C++11实用特性1
1 原始字面量 有时候在输出一个路径字符串时,编译器会将其中的部分内容识别成转义字符进行输出,可以用R "xxx(原始字符串)xxx"其中()两边的字符串可以省略.原始字面量R可以 ...
- 用户 IP,里面藏了多少秘密?
大家都知道,要邮寄一封信给正确的收件人,需要提供准确而精细的地址,这个地址需要从国家和城市精确到邮政编码,街道和门牌号码.只有这样,邮局的工作人员才能知道将信送到那里. Internet 上也是如此, ...
- 前端科普系列(5):ESLint - 守住优雅的护城河
作者:Morrain [前端科普系列]帮助阅读者了解web前端,主要覆盖web前端的基础知识,但不深入讲解,定位为大而全并非细而精,适合非前端开发的同学对前端有一个系统的认识,能更好的与前端开发协作. ...
- Serverless 时代开启,云计算进入业务创新主战场
作者 | 于洪涛 "我们希望让用户做得更少而收获更多,通过 Serverless 化,让企业使用云服务像用电一样简单." Serverless 化正在成为全新的软件研发范式,阿里云 ...
- vscode如何优雅的拥抱eslint
https://www.toutiao.com/a6826129210260587019/?tt_from=weixin&utm_campaign=client_share&wxsha ...
- vue实现word或pdf文档导出的功能
https://www.jianshu.com/p/73915ef6ac89 Vue - element-ui 中预览 word .exce.ppt以及pdf文件 https://blog.csdn. ...
- P1032
写这道不算难的题目是我遇到了不少问题,复述以下过程吧. 由于数据很水,这道题用不到KMP算法,只要使用朴素算法进行字符串比对就可以了. 1 首先,我错误的选择了dfs算法,导致了TLE的发生.这类求最 ...
- python之HtmlTestRunner(二)view无法打开问题解决
默认使用python之HtmlTestRunner会遇到测试报告中的view无法打开的情况 view打不开的情况解决 打开\Lib\site-packages\HtmlTestRunner\templ ...