本文是根据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浏览器(一)的更多相关文章

  1. 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 重点: 实现多级子目录的压缩, ...

  2. [译]介绍一下渐进式 Web App(即时加载) - Part 2

    在上一篇,介绍一下渐进式 Web App(离线) - Part 1的文章中,我们讨论了典型的pwa应该是什么样子的并且同时也介绍了 server worker.到目前为止,我们已经缓存了应用壳.在 i ...

  3. 后台启动weblogic成功后,在web浏览器上无法访问

    后台启动weblogic成功后,在web浏览器上无法访问,可尝试重启服务器.

  4. shellinabox基于web浏览器的终端模拟器

    1. Shellinabox介绍 Shellinabox 是一个利用 Ajax 技术构建的基于 Web 浏览器的远程终端模拟器,也就是说安装了该软件之后,服务器端不需要开启 ssh服务,通过 Web  ...

  5. React Native 项目运行在 Web 浏览器上面

    React Native 的出现,让前端工程师拥有了使用 JavaScript 编写原生 APP 的能力.相比之前的 Web app 来说,对于性能和用户体验提升了非常多. 但是 React Nati ...

  6. 第十一章:WEB浏览器中的javascript

    客户端javascript涵盖在本系列的第二部分第10章,主要讲解javascript是如何在web浏览器中实现的,这些章节介绍了大量的脚本宿主对象,这些对象可以表示浏览器窗口.文档树的内容.这些章节 ...

  7. ASP.NET CORE Web浏览器和Web服务器

    //web浏览器 //浏览器本质的原理:浏览器向服务器发请求,服务器把请求的内容返回给浏览器,然后浏览器把返回的内容绘制成一个图形化的界面 //Socket一种通讯交流的技术 //qq用户把信息通过s ...

  8. [C# 网络编程系列]专题四:自定义Web浏览器

    转自:http://www.cnblogs.com/zhili/archive/2012/08/24/WebBrowser.html 前言: 前一个专题介绍了自定义的Web服务器,然而向Web服务器发 ...

  9. JavaScript 客户端JavaScript之 Web浏览器的环境

    Web浏览器实现的Javascript,通过Web浏览器实现的JavaScript引入了大量可脚本化的对象(1.Web浏览器 2.HTML 3.HTML中的内容)  Web浏览器中的Javascrip ...

  10. cookie是指web浏览器存储的少量数据,该数据会在每次请求一个相关的URL时自动传到服务器中(转)

    基本概念:cookie是指web浏览器存储的少量数据,该数据会在每次请求一个相关的URL时自动传到服务器中. 以博客园为例,我们看看cookie有哪些属性: 1.Name:cookie的名称: 2.V ...

随机推荐

  1. openGauss内核分析:执行计划生成

    摘要:SQL语句解析完成后被解析成Query结构,在进行优化时是以Query为单位进行的,Query的优化分为基于规则的逻辑优化(查询重写)和基于代价的物理优化(计划生成),主入口函数为subquer ...

  2. 火山引擎DataLeap的Catalog系统搜索实践 (二):整体架构

    整体架构 火山引擎DataLeap的Catalog搜索系统使用了开源的搜索引擎Elasticsearch进行基础的文档检索(Recall阶段),因此各种资产元数据会被存放到Elasticsearch中 ...

  3. Mac Maven环境变量配置 zsh: command not found: mvn

    之前配过环境变量,但是后来打开还是报 zsh: command not found: mvn 需要在运行前先刷下环境变量 source ~/.bash_profile 每次使用前都刷一下比较麻烦,这是 ...

  4. PPT 工作计划PPT 应该怎么样改

    收集素材 页面处理 丰富细节 PPT 工作计划PPT 应该怎么样做

  5. Zookeeper面试题总结

    1.请简述Zookeeper的选举机制 假设有五台服务器组成的zookeeper集群,它们的id从1-5,同时它们都是最新启动的,也就是没有历史数据,在存放数据量这一点上,都是一样的. 假设这些服务器 ...

  6. 机器学习的线性代数(Python 版)

    线性代数是数学的分支学科,涉及矢量.矩阵和线性变换.它是机器学习的重要基础,从描述算法操作的符号到代码中算法的实现,都属于该学科的研究范围. 虽然线性代数是机器学习领域不可或缺的一部分,但二者的紧密关 ...

  7. Codeforces Round #679 (Div. 2, based on Technocup 2021 Elimination Round 1) (个人题解)

    1434A. Finding Sasuke // Author : RioTian // Time : 20/10/25 #include <bits/stdc++.h> using na ...

  8. 浅谈 Java 中的 AutoCloseable 接口

    本文对 try-with-resources 语法进行了较为深入的剖析,验证了其为一种语法糖,同时给出了其实际的实现方式的反编译结果,相信你在看完本文后,关于 AutoCloseable 的使用你会有 ...

  9. postman+springboot一次上传多个文件

    开发中到前端一次上传多个文件的需求如何实现,下面使用postman模拟前端的请求,后端使用srpingboot来实现 1.postman设置 2.Java代码 @RestController @Req ...

  10. 十一、docker的容器互联

    系列导航 一.docker入门(概念) 二.docker的安装和镜像管理 三.docker容器的常用命令 四.容器的网络访问 五.容器端口转发 六.docker数据卷 七.手动制作docker镜像 八 ...