深?了解现代?络浏览器(译) part 1

深?了解现代?络浏览器(译) part 1
最新回答
念一诺执千年

2022-04-03 20:59:48

深入了解现代网络浏览器(译)Part 1

基础知识

关于CPU和GPU

  • CPU(Central Processing Unit):中央处理器,可以处理许多不同的任务。在现代硬件中,CPU通常是多个内核,为手机和笔记本电脑提供更多的计算能力。
  • GPU(Graphics Processing Unit):图形处理单元,与CPU不同,GPU擅长跨多个内核处理简单任务。GPU最初是为处理图形而开发的,因此在图形上下文中,“使用GPU”或“支持GPU”与快速渲染和平滑交互相关联。近年来,随着GPU的加速计算,越来越多的计算任务仅在GPU上完成。

通常,应用程序使用操作系统提供的机制在CPU和GPU上运行。

在进程和线程上执行程序

  • 进程(Process):可以描述为应用程序的执行实例。启动应用程序时,将创建一个进程,操作系统为进程分配一块内存,所有引用程序状态都保留在这一块内存空间中。当关闭应用程序时,进程也会消失,操作系统释放这块内存。
  • 线程(Thread):存在于进程内部,执行进程程序的任何部分。一个进程可以创建多个线程来帮助它完成更多任务。

一个进程可以要求操作系统启动另一个进程运行不同的任务,此时操作系统将为新的进程分配一块新的内存(与前者分配的内存不是同一部分)。如果两个进程需要通信,则可以使用Inter Process Communication(IPC)进行进程间通信。许多应用程序都设计为这种方式工作,因此,如果工作进程没有响应,可以重新启动它,而无需停止正在运行应用程序其他部分的进程。

浏览器架构

现代网络浏览器可以使用进程和线程构建为复杂的系统。浏览器可以是一个具有许多不同线程的进程,也可以是具有几个通过IPC进行通信的多个线程的进程。

顶部是浏览器进程,负责协调应用程序的不同部分。对于渲染器进程,将创建多个进程并将其分配给每个选项卡。直到最近,Chrome浏览器才尽可能地给每个标签页一个进程,现在它尝试为每个网站(包括iframe)赋予自己的进程。

每一个进程的作用

  • Browser Process(浏览器进程):控制浏览器应用的主框架部分,包括地址栏、书签、前进/后退按钮等。同时处理浏览器不可见的高权限任务,例如发送网络请求、访问文件等。
  • Renderer Process(渲染进程):控制显示网站的标签内的所有内容。
  • Plugin Process(插件进程):控制网站使用的所有插件,例如Flash。
  • GPU Process(GPU进程):与其他进程隔离地处理GPU任务。由于GPU处理来自多个应用程序的请求并将它们绘制在同一屏幕上,因此将其分为不同的进程。

还有更多的进程,例如扩展进程和实用程序进程。在Chrome浏览器中,可以通过任务管理器查看正在运行的进程数量以及它们正在使用的CPU和内存资源。

Chrome中多进程架构的好处

Chrome使用多个渲染进程,每个选项卡可以有自己的渲染进程。这种架构的好处之一是,当一个选项卡没有响应时,可以关闭该选项卡并继续运行其他选项卡,而不会影响整个浏览器的稳定性。如果所有的选项卡都在一个进程上运行,则当一个选项卡没有响应时,所有选项卡都将无法响应。

将浏览器的工作分为多个进程的另一个好处是安全性和沙箱处理。由于操作系统提供了一种限制进程特权的方法,因此浏览器可以在某些进程中限制部分功能。例如,Chrome浏览器限制了渲染进程处理任意用户输入和文件访问的权限。

然而,由于每个进程都有自己的私有内存空间,因此它们通常包含通用基础结构的副本(例如V8,这是Chrome的JavaScript引擎)。这意味着更多的内存使用情况,因为无法共享这些资源。为了节省内存,Chrome对可启动的进程数量进行了限制。这个限制取决于设备拥有的内存和CPU能力,但是当Chrome达到该限制时,它将开始在一个进程中从同一个站点运行多个选项卡。

节省更多内存 - Chrome中的服务化

Chrome正在进行架构更改,以将浏览器程序的每个部分作为一项服务运行,从而可以轻松拆分为不同的进程或聚合为一个进程。当Chrome在功能强大的硬件上运行时,它可以将每个服务拆分为不同的进程以提高稳定性;但是如果在资源受限的设备上,Chrome会将服务整合到一个进程中以节省内存。

每帧渲染进程 - 站点隔离

站点隔离是Chrome最近引入的功能,可为每个跨站点iframe运行单独的渲染进程。在过去,每个选项卡一个渲染进程,允许跨站点iframe在单个渲染进程中运行,并在不同站点之间共享内存空间。然而,这存在安全风险,因为即使相同来源策略是web的核心安全模型,也无法完全防止一个站点未经同意访问其他站点的数据。进程隔离是分离站点的最有效方法。

从Chrome 67开始,默认情况下启用站点隔离,因此选项卡中的每个跨站点iframe都会获得一个单独的渲染进程。启用站点隔离是一项多年的工程,因为它不仅涉及分配不同的渲染进程,还从根本上改变了iframe彼此交流的方式。例如,在页面上打开具有在不同进程上运行的iframe的开发者工具(devtools),意味着devtools必须实施幕后工作才能使其无缝显示。即使运行简单的Ctrl + F在页面中查找单词,也意味着跨不同的渲染进程进行搜索。