深刻了解现代浏览器之一 - 架构

在 Chorme Developer 上无心之中翻到了这个系列,做者描写的很清楚,而且配图十分的优秀,推荐阅读(阅读的时候须要注意这篇博客发布的时候是 2018 年 9 月,有些东西可能对于如今来讲有一些过期了)。这是这个系列博客的第一部分,主要是研究浏览器架构。CPU 和 GPU 在这里就不谈了,你能够去 原文查看。

在进程和线程上执行程序

进程是边框,线程做为抽象鱼在进程内部活动

在深刻浏览器以前,咱们须要掌握进程和线程的概念。一个进程能够当作一个应用的执行程序,而线程是存在于进程内部来执行任意部分程序的。web

启动应用时,将会建立一个进程。这个进程会建立一个或多个线程来帮助它进行工做,但这不是必须的。操做系统为进程提供了一个内存块,全部进程的状态都保存在这个专用的内存空间中,当你关闭应用的时候,进程也会随之消失,操做系统就会释放内存。浏览器

一个进程可让操做系统启动另外一个进程来运行其余任务。这样操做系统会为新的进程分配新的内存。若是这两个进程须要对话,则能够用 IPC (进程间通讯)来实现。许多程序被设计成多进程就是由于若是其中一个进程未响应的时候,它能够进行重启而不会影响到应用的其余进程。安全

浏览器架构

了解了上面的知识,那咱们如何使用进程和线程来构建浏览器应用呢?它能够是一个具备多线程的进程的架构,也能够是多个进程经过 IPC 进行通讯的架构。网络

不一样的架构

须要注意的是不一样的架构属于实现细节,关于浏览器的构建并无一个标准,两个浏览器可能使用的架构方式可能会不同。多线程

这个系列里,会使用以下图的 Chrome 最新架构方式。架构

Chrome 的多进程架构图,渲染进程下的多个进程时表示 Chrome 为每一个选项卡都建立了渲染进程

最上面是浏览器进程,负责协调调度其余进程。对于渲染进程,会建立多个进程来分配给每个标签页。直到最近,Chrome 才尽量的为每一个标签页分配一个进程。如今,Chrome 尝试给每一个站点分配本身的进程,包括 iframe 的。ide

每一个进程控制什么?

下面介绍了每一个进程以及它控制的地方:工具

进程 负责
Browser 负责处理属于 Chrome 的部分,好比地址栏、书签、前进后退按钮等等,以及一些看不见的须要权限的部分,好比网络请求、文件访问
Renderer 负责处理标签页内的显示工做
Plugin 负责处理网站用到的全部插件,好比 Flash
GPU 被分离出来独立处理 GPU 任务,因为 GPU 会处理来自不一样应用的请求,绘制到同一个地方,因此将它单独拆出来

不一样的进程负责不一样的地方

除了这些,还有其余进程,好比扩展进程、实用程序进程。若是你想看看你的 Chrome 里有多少进程,能够点击右上角选择更多工具,而后选择任务管理器,这时候你就可以看到当前运行的进程了。性能

多进程架构的好处

上面提到 Chrome 使用多个渲染进程。想象这么一个场景,每一个标签页都有本身的进程。好比你打开了三个标签页,那么每一个标签页都对应着一个进程,当其中一个不响应了,你能够关闭它,其余的标签页都是正常的。若是三个都在一个进程中,那一个不响应,三个都会挂掉。网站

把浏览器的工做分红多个进程的另外一个好处就是安全性和沙箱。因为操做系统提供了一种限制进程权限的方法,浏览器就能够在某些进程上对这些功能进行限制。好比,Chrome 会限制能够接收任意用户输入的渲染进程对任意文件的访问。

因为进程的内存是隔离的,因此这些进程都会保存一份基础架构的副本,好比 V8 引擎。这意味着会浪费更多的内存,由于没法共享它们。为了节省内存,Chrome 对开启的进程数作了限制,这个限制取决于你的电脑性能,当到达限制后,Chrome 会在一个进程内运行来自同一个网站的多个标签页。

节省更多内存 - Chrome Servicification

将相同的方法应用到浏览器上,Chrome 将浏览器的每一个部分做为服务来运行,以即可以轻松的分解或者是合并。

一般的想法是,当 Chrome 运行在性能强悍的计算机上时,把服务拆分红不一样的进程,从而达到更高的稳定性,可是若是计算机的性能很差的时候,Chrome 会将服务合并成一个进程以节省内存占用。

站点隔离

站点隔离是 Chrome 最近的一个功能,为每个跨站的 iframe 单独运行一个渲染进程。咱们刚刚一直讨论的是为每一个标签页启动一个进程的模式,这个进程容许跨站 iframe 在渲染进程中执行并在不一样站之间共享内存。在相同的进程上运行 a.comb.com 彷佛看起来是能够的。可是同源策略是 Web 的核心安全策略,这样能够保证一个站点未经赞成就不能访问其余站点的数据。这样一来绕过这个安全策略就是安全攻击的主要目标。而进程隔离是分割站点最有效的办法。随着 Meltdown and Spectre 漏洞的公开,咱们更加须要使用进程来隔离站点了。自 Chrome 67 以来在桌面版默认启用了站点隔离,选项卡中的每一个跨站 iframe 都会启动一个单独的渲染进程。

站点隔离

为了启用站点隔离,花费了多年时间去研究,它不像分配不一样的渲染进程这么简单。它从根本上改变了 iframes 之间的对话方式。在运行着不一样站点 iframe 的页面上打开 DevTools 意味着,DevTools 必需要在后台让它看起来是无缝的。即使是运行 Ctrl + F 来进行搜索,也意味着要在不一样的进程中进行全部,这就是浏览器工程师将站点隔离的发布做为重要里程碑的缘由。

PS: 上传文章,发现有些动图上传失败了,为了更好的阅读体验,欢迎到公众号查看文章,后续还会有接下来的三篇。

欢迎关注、转发、分享支持我。

公众号

相关文章
相关标签/搜索