[译]深入了解现代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 ...
随机推荐
- 单向数据流-从共享状态管理:flux/redux/vuex漫谈异步数据处理
不管是Vue,还是 React,都需要管理状态(state),比如组件之间都有共享状态的需要. 什么是共享状态? 比如一个组件需要使用另一个组件的状态,或者一个组件需要改变另一个组件的状态,都是共享状 ...
- 网站web服务器个人博客站开通那些端口合适?
一般网站服务器,只需要开通80 443,(ssh端口默认22,,建议修改) ping命令没有端口,因为ICMP 协议没有到tcp层,仅走ip层,由于IP层协议是一种点对点的协议,而非端对端的协议,它提 ...
- 火山引擎DataLeap的Data Catalog系统搜索实践 (上)
更多技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,回复[1]进入官方交流群 摘要 火山引擎大数据研发治理套件 DataLeap的Data Catalog系统通过汇总和组织各种元数据,解决了数 ...
- Mac 向日葵设置
- 断点续传(上传)Java版
PostMan 客户端调用部分见,断点续传(上传)C#版 1. 客户每次上传前先获取一下当前文件已经被服务器接受了多少 2. 上传时设定偏移量,跳过服务器已收到的长度 @SpringBootTest ...
- 基于BaseHTTPRequestHandler的HTTP服务器基础实现
1. BaseHTTPRequestHandler介绍 BaseHTTPRequestHandler是Python中的一个基类,属于http.server模块,用于处理HTTP请求的基本功能.它提供了 ...
- 如何使用Java在Excel中添加动态数组公式?
本文由葡萄城技术团队发布.转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具.解决方案和服务,赋能开发者. 前言 动态数组公式是 Excel 引入的一项重要功能,它将 Excel 分为两种风 ...
- 用 three.js 绘制三维带箭头线 (线内箭头)
在LineMaterial.js基础上修改的ArrowLineMaterial.js代码: /** * @author WestLangley / http://github.com/WestLang ...
- 2021 VDC :vivo 互联网服务亿级用户的技术架构演进之路
关注公众号[vivo互联网技术]--回复[2021VDC]获取大会PPT. 2021年12月16日,vivo 开发者大会圆满落幕.在互联网技术专场中,来自vivo 互联网技术的6位研发专家,从基础架构 ...
- vue路由模块化
https://www.bilibili.com/video/BV1Tg411u7oy?from=search&seid=5098139115981575542&spm_id_from ...