从浏览器层面看前端性能:了解 Chrome 组件、多进程与多线程

news/2025/1/24 6:55:09/

一、 前言

现阶段的浏览器运行在一个单用户,多合作,多任务的操作系统中。一个糟糕的网页同样可以让一个现代的浏览器崩溃。其原因可能是一个插件出现bug,最终的结果是整个浏览器以及其他正在运行的标签被销毁。

现代操作系统已经非常健壮了,它让应用程序在各自的进程中运行和不会影响到其他程序。一个进程崩溃不会损害到其他进程以及操作系统。同时系统会严格的限制一个用户访问另外一个用户空间的数据。

浏览器属于一个应用程序,而应用程序的一次执行,可以理解为计算机启动了一个进程,进程启动后,CPU会给该进程分配相应的内存空间,当我们的进程得到了内存之后,就可以使用线程进行资源调度,进而完成我们应用程序的功能。

而在应用程序中,为了满足功能的需要,启动的进程会创建另外的新的进程来处理其他任务,这些创建出来的新的进程拥有全新的独立的内存空间,不能与原来的进程内向内存,如果这些进程之间需要通信,可以通过IPC机制(Inter Process Communication)来进行。

fileOf7256.png

 

假如我们去开发一个浏览器,它的架构可以是一个单进程多线程的应用程序,也可以是一个使用IPC通信的多进程应用程序。

chrome为例,使用IPC通信的多进程应用程序

chrome浏览器与其他浏览器不同,chrome使用多个渲染引擎实例,每个Tab页一个,即每个Tab都是一个独立进程。

二、浏览器组件

浏览器大体上由以下几个组件组成,各个浏览器可能有一点不同。

fileOf7256.png

 

fileOf7256.png

 

  • 界面控件 – 包括地址栏,前进后退,书签菜单等窗口上除了网页显示区域以外的部分

  • 浏览器引擎 – 查询与操作渲染引擎的接口

  • 渲染引擎 – 负责显示请求的内容。比如请求到HTML, 它会负责解析HTML、CSS并将结果显示到窗口中

  • 网络 – 用于网络请求, 如HTTP请求。它包括平台无关的接口和各平台独立的实现

  • UI后端 – 绘制基础元件,如组合框与窗口。它提供平台无关的接口,内部使用操作系统的相应实现

  • JS解释器 - 用于解析执行JavaScript代码

  • 数据存储持久层 - 浏览器需要把所有数据存到硬盘上,如cookies。新的HTML5规范规定了一个完整(虽然轻量级)的浏览器中的数据库web database

三、Chrome的并发模型

chrome的进程,chrome没有采用一般应用程序的单进程多线程的模型,而是采用了多进程的模型,按照他的文字说明,主界面框架下的一个TAB就对应这个一个进程。但实际上,一个进程不仅仅包含一个页面,实际上同类的页面在共用一个进程。

Google在宣传的时候一直都说,Chrome是one tab one process的模式。实际上,Chrome支持的进程模型远比宣传丰富,简单的说,Chrome支持以下几种进程模型:

  • Process-per-site-instance:就是你打开一个网站,然后从这个网站链开的一系列网站都属于一个进程。这是Chrome的默认模式。

  • Process-per-site:同域名范畴的网站放在一个进程,比如www.google.com和www.google.com/bookmarks就属于一个域名内(google有自己的判定机制),不论有没有互相打开的关系,都算作是一个进程中。用命令行–process-per-site开启。

  • Process-per-tab:这个简单,一个tab一个process,不论各个tab的站点有无联系,就和宣传的那样。用–process-per-tab开启。

  • Single Process:这个很熟悉了吧,即传统浏览器的模式:没有多进程只有多线程,用–single-process开启。

四. 多进程的好处

把渲染放到另外个进程防止崩溃了影响主进程。webkit最初时候很多内存泄露。多进程能很大程度避免。一个进程关了,所有内存就回收了。其次,多进程安全性更好。如果blink被发现什么提权漏洞,例如写一段js就能控制整个chromium进程做任何事情,显然多进程可以把损失限制在渲染线程。渲染线程拿不到主进程的各种私密信息,例如别的域名下的密码。

fileOf7256.png

 

五. 多线程模型

chrome进程模型下有

1.Browser进程只有一个,主控整个系统的运行,管理Chrome大部分的日常事务;

  • 负责浏览器页面的显示,各个页面的管理,所有其他类型进程的祖先,负责他们的创建和销毁。

2.UI thread:

  • 负责浏览器界面显示,与用户交互。如前进,后退等,将Renderer进程得到的内存中的Bitmap,绘制到用户界面上

  • network thread:网络资源的管理,下载等(这个和网络进程间???)

  • storage thread:控制文件等的访问;

3.Renderer 浏览器渲染进程(浏览器内核), 主要负责页面的渲染和显示:页面渲染,脚本执行,事件处理等。默认每个Tab页面一个Renderer进程(Renderer进程,内部是多线程的)

4.Utility Network:网络进程,负责页面网络资源的加载

5.GPU进程:最多只有一个,GPU硬件加速打开时才会被创建,用于3D绘制等。

6.NPAPI或PPAPI插件进程,每种类型的插件对应一个进程,仅当使用该插件时才创建。

1995 年 Netscape 发明了NPAPI (Netscape plugin API)这个种架构,来帮助浏览器渲染一些HTML没有的东西。比如 PDF, 比如 视频, 以及等等。NPAPI不限制插件自由访问系统所有的API,而且和浏览器是平级运行的。现在已被禁用。PPAPI是谷歌提出的架构。

7.Pepper插件进程

8.其他类型的进程,比如Linux的Zygote进程;Sandbox进程。

fileOf7256.png

 

fileOf7256.png

 

Browser作为主进程最先启动,Browser包含一个主线程mainthread,在mainthread中对整个系统进行初始化,并启动为另外几个线程,看下面的代码:

void CreateChildThreads(BrowserProcessImpl* process) {process->db_thread(); //负责数据库处理process->file_thread(); // 负责文件管理process->process_launcher_thread();process->cache_thread(); //负责管理缓存process->io_thread(); //负责管理进程间通信和所有I/O行为。}

io_thread不仅负责Browser进程的I/O,而且其他Renderer的I/O请求也会通过进程间通信发送到这个线程,由该线程进行处理,最后把结果在返回给各个Renderer进程。各个线程的功能不一样,但设计模式是一样的

对于Renderer进程,它们通常有两个线程:一个是Main thread,负责与主线程联系。另一个是Render thread,它们负责页面的渲染和交互

fileOf7256.png

 

当我们是要浏览一个网页,我们会在浏览器的地址栏里输入URL,这个时候Browser Process会向这个URL发送请求,获取这个URL的HTML内容,然后将HTML交给Renderer Process,Renderer Process解析HTML内容,解析遇到需要请求网络的资源又返回来交给Browser Process进行加载,同时通知Browser Process,需要Plugin Process加载插件资源,执行插件代码。解析完成后,Renderer Process计算得到图像帧,并将这些图像帧交给GPU Process,GPU Process将其转化为图像显示屏幕。


http://www.ppmy.cn/news/1565705.html

相关文章

基于先验领域知识的归纳式多实例多标签学习用于牙周病分类| 文献速递 -医学影像人工智能进展

Title 题目 Abductive multi-instance multi-label learning for periodontal diseaseclassification with prior domain knowledge 基于先验领域知识的归纳式多实例多标签学习用于牙周病分类 01 文献速递介绍 牙科疾病对口腔健康构成了重大挑战,影响了全球大量…

无数据库开源Wiki引擎WikiDocs

简介 什么是 WikiDocs ? WikiDocs 是一个无数据库的开源 Markdown 文件平面 Wiki 引擎。它旨在提供一个简单、灵活且易于使用的 Wiki 解决方案,允许用户创建和管理文档而无需依赖传统数据库。 主要特点 无数据库:使用纯文本文件存储数据&am…

【mptcp】ubuntu18.04和MT7981搭建mptcp测试环境操作说明

目录 安装ubuntu18.04,可以使用虚拟机安装... 2 点击安装VMware Tool 2 更新ubuntu18.04源... 4 安装ifconfig指令工具包... 5 安装vim工具包... 5

【赵渝强老师】K8s中Pod探针的HTTPGetAction

在K8s集群中,当Pod处于运行状态时,kubelet通过使用探针(Probe)对容器的健康状态执行检查和诊断。K8s支持三种不同类型的探针,分别是:livenessProbe(存活探针)、readinessProbe&#…

【玩转全栈】----Django连接MySQL

阅前先赞,养好习惯! 目录 1、ORM框架介绍 选择建议 2、安装mysqlclient 3、创建数据库 4、修改settings,连接数据库 5、对数据库进行操作 创建表 删除表 添加数据 删除数据 修改(更新)数据: 获取数据 1、OR…

【趣学SQL】第三章:数据处理与管理 3.1数据清洗技术——给数据库做“数据SPA“的魔幻之旅

第三章:数据处理与管理 3.1 数据清洗技术——给数据库做"数据SPA"的魔幻之旅 欢迎来到「数据库美容院」!今天我们将化身"数据美容师",用一家虚拟网红餐厅的翻车案例,教你如何把脏乱差的原始数据变成清爽整洁…

Web安全:缓存欺骗攻击;基于缓存、CDN的新型Web漏洞

基于缓存、CDN的新型Web漏洞 漏洞原理利用方式解决方法 Web缓存欺骗漏洞(Web Cache Deception)是一种利用不安全的缓存机制来泄露用户敏感信息的攻击方式。攻击者通过操控请求URL诱导缓存系统将敏感信息缓存并对其他用户公开,可能导致用户数据…

【Julia】在Julia中优雅地配置Artifacts

引言 🌟 在Julia包开发中,我们经常需要处理外部依赖和数据文件。Julia的Artifacts系统提供了一个优雅的解决方案,让我们可以轻松管理这些依赖。本文将介绍如何在Julia项目中正确配置和使用Artifacts。 什么是Artifacts? &#x…