浏览器工作原理(超级详解!!!!)

2023-05-16

浏览器工作原理

浏览器的结构

用户界面 —> 浏览器引擎—>渲染引擎

渲染引擎上有: 网络 js解析器 -------->也称浏览器内核

浏览器引擎上有:数据持久层(帮助浏览器存储数据 如cookie等)

各个浏览器的内核

IE —> Trident

Firefox —>Gecko

safari ----> Webkit并开源

Chrome ----->Webkit改造优化的Blink 也开源

Opera与Edge 使用是Blink

进程与线程

进程 是操作系统进行分配资源分配和调度的基本单位,可以申请和拥有计算机资源,进程是程序的基本执行实体。

线程 是操作系统能够进行运算调度的最小单位,一个进程中可以并发多个线程,每个线程并行执行不同的任务

进程之间传递数据 : 通过进程间通信管道IPC传递

应用是多进程的原因是:为了避免某一个进程卡死,而导致应用卡死,因为进程之间相互独立,这样不会影响到整个应用程序。

然后进程通过创建更多线程并行执行不同的任务,同一进程下的线程是可以直接通信共享数据的

单进程带来的问题

1.不稳定: 一个线程出现了问题可能会导致整个进程出问题进而导致浏览器无法正常运行

2.不安全: 因为线程之间是可以随意共享数据 那么一个线程就可以获取整个浏览器的信息

3.不流畅: 一个进程需要负责很多内容,会导致运行效率的问题

多进程的结构
在这里插入图片描述

1.浏览器进程

负责控制除标签页外包括地址栏、书签、后退和前进按钮及负责与浏览器的其他进程协调工作

2.网络进程

负责发起接收网络请求

3.GPU进程

负责整个浏览器界面的渲染

4.插件进程

负责控制网络使用的所有插件

5.渲染器进程

负责用来控制显示tab标签内的所有内容(浏览器会默认情况下为每个标签页都创建一个进程)

注意 给每个tab标签创建进程是让它们相互独立 互不影响 当一个标签页卡死不会影响其他标签 页不会使浏览器卡死

在浏览器地址栏输入内容时的浏览的内部变化(本篇重点)

1.浏览器进程的UI线程会捕捉你的输入内容

如果是网址则UI进程会启动一个网络线程来请求DNS进行域名解析,接着开始连接服务器获取数据

如果是一串关键字浏览器就会判断出你是要搜索,于是会使用默认配置的搜索引擎来查询

2.当网络线程获取到数据后

  • 会通过SafeBrowsing(谷歌内部的一套站点安全系统)来检测站点是否是恶意站点,如果是,则会提示整个警告页面,告诉你安全隐患,浏览器会阻止你的访问(可强行访问)

  • 当检测通过时网络线程会通知UI线程,然后渲染器进程(Render Thread)来渲染页面

  • 浏览器进程通过IPC管道将数据传递给渲染器进程的主线程正式进入渲染器进程

  • 主线程将html解析构造DOM树–>进行样式计算–>根据DOM树和生成和的样式生成Layout Tree–>通过遍历Layout Tree生成绘制顺序表(paint)–>接着遍历了Layout Tree生成了Layer Tree

    然后主线程将将Layer Tree和绘制信息一起传递给合成器线程

    合成器线程按照规律进行分图层,并把图层分为更小的图块(tiles)传给栅格线程

    栅格化线程 进行栅格化

    栅格化完成后合成器线程会通过栅格化线程传递过来的"draw quads"图块信息

    根据这些信息合成器线程上合成了一个合成器帧然后将该合成器帧通过IPC传回给浏览器进程

    浏览器进程再传递到GPU进行渲染,之后展示到你的屏幕上了

    在这里插入图片描述

    重排

    当我们改变一个元素的尺寸位置属性时会重新进行样式计算(Computed Style)布局(Layout)绘制(Paint)以及后面所有的流程

    重绘

    当我们改变某个的颜色属性时不会触发重排触发布局但还是会触发样式计算和绘制

    关于不能大量重排重绘的原因及解决办法

    • 动画卡顿原因:

    我们可以发现重排和重绘都会占用主线程,还有JS也是运行在主线程上,这样就会引发出现抢占执行时间的问题,如果你写了一段不断导致重排重绘的动画,浏览器则需要在每一帧都运行样式计算布局和绘制的操作,这种情况下会出现动画卡顿是由于js执行时间过长就会导致在下一帧开始时js没有及时归还主线程导致下一帧动画没有按时渲染。

    • 解决办法:

    1.通过requestAnimationFrame()来解决,它会在每一帧被调用通过API的回调然后我们和把js运行任务分成一些更小的任务块(分到每一帧)在每一帧时间用完前暂停js执行归还主线程,这样在下一帧开始时就可以按时执行布局和绘制 React的渲染引擎React Fiber就用到这个API做了很多优化

    在这里插入图片描述

    2.前面介绍我们可以知道 栅格化的整个流程是不占用主线程的只在合成器线程和栅格线程中运行,这就意味着它无需和JS抢占主线程,多次重排重绘掉帧是因为JS的执行阻塞了主线程,而css中的一个动画属性transform,该属性实现的动画不会经过布局和绘制,而是直接运行在合成器线程和栅格化线程中所有不会受到主线程中JS执行的影响,更重要的是通过transfrom实现的动画由于不需要经过布局绘制样式计算等操作所以节省很多运算时间(方便实现负责的动画)

详解:

渲染器进程把接收到的html、css、js、image等资源渲染成用户可以交互的web页面,渲染器进程的主线程将html进行解析构造DOM(文档对象模型是浏览器对页面在其内部的表示形式是web开发程序员可以通过JS与之交互的数据结构和API)数据结构

html首先经过tokeniser标记化通过词法分析将输入的html内容解析成多个标记根据识别后的标记紧进行DOM数构造,在这个过程中会创建document对象,然后以document的根节点的DOM树不断进行修改向其中添加各种元素 html中会引入额外资源如图片、css、js脚本等,图片和css这些资源需要通过网络下载或者从缓存中直接加载,这些资源不会堵塞html的解析,因为它们不会影响DOM的生成。但当html解析过程中遇到script标签就会停止html的解析流程转而加载解析并且执行js**(原因是js浏览器并不知道js执行是否会改变当前的HTML结构,如果js代码里调用了document.write()修改HTML,哪之前的html解析就没有任何意义了故script标签要放在合适的位置如末尾也可以使用defer和async属性来异步加载js)**

在html解析后我们就会获得一个DOM Tree()树,主线程解析css并确定每个DOM节点的计算样式(注意即使没有提供自定义css样式浏览器也会提供默认样式 比如 h1 标签的自带样式)在dom节点知道每个节点的样式后我们需要知道每个节点放在页面的哪个位置(即该节点的坐标以及该节点需要需要占用多大的区域---->layout布局阶段),主线程通过变量dom和计算好的样式来生成layout Tree,layout Tree每个节点都记录了x,y坐标和边框尺寸(注意layout Tree与DOM Tree 不是一一对应的,重点display:none不会出现在layout Tree上会在DOM上有节点 befter 伪类添加的content元素会出现在layout Tree上不会出现在DOM树上 **原因是:**DOM是通过HTML解析获得并不关心样式 而layout Tree是通过DOM和计算好的样式来生成,layout是通过最后展示在屏幕上的节点对应的),

然后我们还需要知道以什么样的顺序绘制(paint)这个节点 (z-index属性会影响节点绘制的层级关系)为了保证在屏幕上展示正确的层级主线程遍历layout Tree创建一个绘制记录表(paint Record)该表记录了绘制的顺序---->绘制阶段,然后到把这些信息转化为像素点显示在屏幕的时候了这种行为被称为栅格化(Restering)

最早的Chrome使用的是只栅格可视区域的内容当用户滚动页面时再栅格化更多的内容来填充缺失的部分 问题展示延迟

现在使用的是合成(Composting),它是一种将页面的各个部分分成多个图层分别对其进行栅格化,并在合成器线程的技术中单独进行合成页面,简单来说就是页面所有的元素按照按照某种规则进行分图层,并把图层都栅格化好了,然后只需要可视化的内容组合成一帧展示给用户即可

最后 主线程遍历Layout Tree生成Layer(图层)Tree 当Layer Tree生成完毕和绘制顺序确定后,主线程将这些信息传递给合成器线程,合成器线程将每个图层栅格化,由于一层可能像页面的整个长度一样大因此合成器线程将他们切分为许多图块 然后将每个图块发送给栅格化线程 栅格化线程栅格化每个图块,并将它们存储在GPU内存中,当图块栅格化完成后合成器线程将收集称为“draw quads”的图块信息,这些信息记录了图块在内存中的位置和在页面的哪个位置绘制图块的信息,根据这些信息合成器线程生成了一个合成器帧,然后合成器Frame(帧) 通过IPC传送给浏览器进程,接着浏览器进程将合成器帧传送到GPU,然后GPU进程渲染展示到屏幕上,当你滚动页面则会重述上面操作生成新的合成器帧等等等

最后

本篇内容根据 我最喜欢的UP主 视频编写完成 请大家多多关注他

objtube的卢克儿

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

浏览器工作原理(超级详解!!!!) 的相关文章

  • 深度学习图像分类实战——pytorch搭建卷积神经网络(AlexNet, LeNet, ResNet50)进行场景图像分类(详细)

    目录 1 一 实验过程 1 1 实验目的 1 2 实验简介 1 3 数据集的介绍 1 4 一 LeNet5网络模型 1 5 二 AlexNet网络模型 1 6 三 ResNet50 xff08 残差网络 xff09 网络模型 二 实验代码
  • c++实现经典游戏贪吃蛇(超详解)

    经典版 要求 xff1a 1碰到四周和自身游戏结束 xff1b 2迟到食物蛇身增长 xff1b 3食物吃得越多游戏越快 xff1b 4通过w a s d可控制蛇头的方向 xff1b 5蛇身颜色不一致 源码 xff08 需要easy x 贪吃
  • c++中求数组的长度

    c 43 43 中求数组的长度 数组长度 61 sizeof 数组名 sizeof 数组类型 span class token macro property span class token directive hash span span
  • 实验 1 UML 类图实验

    实验内容 作图工具 xff1a PowerDesigner 1 绘制以下类图并生成源代码 xff08 语言不限 xff09 xff1a 2 根据以下描述绘制类图 xff0c 再正向工程生成 Java 源代码 xff08 也可生成其他面 2
  • 贪吃蛇(C++)

    一 项目思路 该项目用于计算机软件课设 贪吃蛇要解决的问题有 xff1a 蛇身的移动 xff0c 事物的随机生成 xff0c 蛇头与食物重合 xff0c 蛇吃食物身体的变长 蛇身移动的处理可以改变蛇首元素 xff08 蛇身用数组存储 xff
  • C语言编程工具Dev C++的安装教程

    一 Dev C 43 43 安装包 xff08 5 11版本 xff09 无偿分享 Dev C 43 43 5 11 简体中文版下载地址 xff1a 百度网盘 xff1a 链接 xff1a https pan baidu com s 1Yb
  • winform基础 C#编程

    1 winform应用程序是一种智能客户端技术 xff0c 帮助我们获得信息或者传输信息 2 当后台需要获取前台控件属性 xff0c 需要使用Name属性 visible 指示一个空间是否可见 enabled 指示一个空间是否可用 3 事件
  • 联合索引为啥需要满足最左前缀原则?

    在回答这个问题之前 首先需要先了解清楚何为联合索引 联合索引就是MySQL设计大叔为了节省内存而创建的将多个列的值作为非叶子节点存储的B 43 树结构 比如按照key part1 key part2 key part3列创建了idx key
  • 堆栈和变量的分配区域

    转载自 http mengren425 blog 163 com blog static 56903931200791003721118 一 预备知识 程序的内存分配 一个由c C 43 43 编译的程序占用的内存分为以下几个部分 1 栈区
  • 2023海南大学835软件工程原理方法与应用考研总结

    不知不觉23考研已经结束一个星期了 xff0c 考试的过程还历历在目 政治复习虽然看完了徐的视频 xff0c 刷完了1000题 xff0c 写了肖8肖4 xff0c 背了肖4大题 xff0c 但选择题写的时候还是十分纠结 xff0c 用了一
  • vue 封装 axios 请求

    需求 xff1a 向后端请求拿数据 好处 xff1a 把所有的请求方法放在一个文件夹里面 xff0c 方便优化 先把 axios 安装起 npm install axios save 接下来按照步骤走吧 go go go 1 在src路径下
  • Python:从清华源安装第三方库

    python 在使用pip安装的时候 xff0c 一些小一点的还好 xff0c 安装一些大的包的时候 xff0c 会非常的慢甚至出现timeout的报错 xff0c 这时我们就可以使用清华大学的镜像来安装 xff0c 打开终端 xff1a
  • 用OpenStack搭建简单的云平台并启动云主机

    OpenStack OpenStack简介OpenStack重要集成组件OpenStack平台部署部署环境建立虚拟机 配置时间同步安装OpenStack安装 RabbitMQ 消息队列服务Memcached缓存令牌的安装安装和配置OpenS
  • 关于VMware USB arbitration Serve 服务无法启动的问题

    文章目录 问题方法一方法二 问题 虚拟机插入U盘或者PA等其他USB设备时无法识别 xff0c 经过一番查询发现是本机的VMware USB arbitration Serve 没有启动 xff0c 然后 打开以后尝试启动VMware US
  • keil5安装记录(基于stm32芯片配置)

    参考资料地址正点原子 下载上述地址中的文件 xff0c 根据自己芯片的型号下载 xff0c 如仅安装keil仅下载网盘中的 软件资料 即可 xff0c 同时也可在官网下载 xff0c 但是不推荐下载最新版本 xff0c 因为很多报错没有可参
  • 黎曼几何与黎曼流形

    目录 0 黎曼几何 1 欧几里得几何与黎曼几何的区别 2 黎曼流形 3 黎曼距离 4 切空间 5 黎曼均值 6 SPD矩阵如何形成黎曼流型 7 切线空间映射 8 同余变换和同余不变 9 黎曼对齐 科普性笔记 xff0c 做了解 xff0c
  • Faster R-CNN

    1 论文简介 论文名 xff1a Faster R CNN Towards Real Time Object Detection with Region Proposal Networks 论文地址 xff1a Faster R CNN 论
  • 手把手教你安装VSCode(附带图解步骤)

    一 前端工具vscode 1 1 概述 前端开发是创建Web页面或app等前端界面呈现给用户的过程 xff0c 通过HTML xff0c CSS及JavaScript以及衍生出来的各种技术 框架 解决方案 xff0c 来实现互联网产品的用户
  • 前端小知识:1.A标签的用法

    前端小知识 1 A标签的用法 Hello xff0c 大家好 xff0c 我是仲桉君 因为一些不可抗因素停更了很久 xff0c 但是我还是回来了从今天开始正式开始更新 这个系列是有关一些前端的小知识的小博文 预计更新20篇以上 争取做到每日

随机推荐

  • 从uboot中学习C语言基本功(uboot/lib_generic/vsprintf.c/simple_strtoul)

    此函数有以下几点值得注意 xff1a 1 第一个参数中的const 一般在函数的形参中 xff0c 如果我们只是希望调用者使用该参数 xff0c 而不会去改变该 参数内容 xff08 一般是指针指向的内容 xff09 xff0c 则可以声明
  • C++语法基础

    C 43 43 环境安装和基础知识 1 xff1a C 43 43 环境安装与配置 我使用的编译器是Clion xff0c 解释器配置的是Dev C 43 43 自带的解释器 xff0c Clion安装见下文 Clion的安装和配置 xff
  • Samba服务

    目录 配置yum源 安装samba服务 配置samba服务 Windows环境使用Samba服务 Linux环境使用Samba服务 xff08 1 xff09 方法一使用smbclient命令 xff08 2 xff09 方法二使用挂载的方
  • 已解决—The connection to the server localhost:8080 was refused - did you specify the right host or port

    运行 kubectl get namespace时报错 xff1a root 64 ip 10 0 0 8 kubectl get namespace E0320 07 39 20 866425 32422 memcache go 265
  • 修改ideal中java项目jdk版本,记得收藏

    1 Ctrl 43 Shfit 43 Alt 43 S 进入Settings 窗口 xff0c 修改红框标记的两处jdk版本 2 Ctrl 43 Shfit 43 Alt 43 S 进入Project Structure窗口 xff0c 先
  • GO语言开发环境配置(Linux)

    Go语言开发环境配置 xff08 Linux xff09 一 Go安装二 IDE安装三 Vim IDE 常用功能 一 Go安装 Go 有多种安装方式 xff0c 比如 Go 源码安装 Go 标准包安装 第三方工具 xff08 yum apt
  • HBase过滤器

    目录 一 介绍 1 hbase运算符 2 Hbase 过滤器的比较器 二 代码 1 hbase建表 2 创建数据 3 导入依赖 4 列值过滤器 5 单列值过滤器 6 单列值排除过滤器 7 rowkey过滤器 8 rowkey前缀过滤器 xf
  • Hive与HBase之间的区别和联系

    目录 概念 Hive HBase 共同点 区别 关系 首先要知道Hive和HBase两者的区别 xff0c 我们必须要知道两者的作用和在大数据中扮演的角色 概念 Hive 1 Hive是hadoop数据仓库管理工具 xff0c 严格来说 x
  • VSCode(Visual Studio Code )软件(插件)安装与使用

    VSCode 简介 Visual Studio Code 简称 VS Code VSC 是微软公司推出的一款免费开源的现代化轻量级代码编辑器 xff0c 支持几乎所有主流的开发语言的语法高亮 智能代码补全 GIT 等特性 xff0c 支持插
  • 51单片机智能小车

    最近学校举办了一个智能小车比赛 xff0c 比赛内容为用手机蓝牙控制小车拥有5个功能 xff0c 分别是超声波舵机避障 xff0c 测距 xff08 显示在LCD1602上 xff09 xff0c 红外跟随 xff0c 循迹还有蓝牙控制小车
  • 在Matlab中通过mex使用cuda的方法

    仅供参考 xff0c 具体问题需要具体分析 xff01 1 cuda安装及配置 xff0c 参考下面这篇 cpp文件调用cuda函数 苹果挨炮的博客 CSDN博客 2 Matlab配置mex编译环境 在matlab命令行中输入以下命令 me
  • container_of 详解

    container of宏的功能 xff1a 从结构体类型 type 的一个成员 member 指针 ptr xff0c 反推得到该结构体的指针 其实现由两个分号隔开的语句组成 xff0c 首先用typeof关键字 xff0c 得到memb
  • ubuntu 内存清理【亲测有效】

    目录 一 xff1a 引言 二 xff1a ubuntu 内存清理 应急 1 移除掉不再需要的软件包 2 清理ubuntu中的APT缓存 3 清理缩略图缓存 4 手动删除老旧Linux内核 5 删除多余的孤立包 6 卸载不必要的应用程序 一
  • hdfs的常见语句

    开hdfs环境 xff1a xff08 开启成功后用jps命令出来至少6条数据 xff09 start all sh 关hdfs环境 xff08 记得关 xff0c 容易坏 xff09 xff1a stop all sh 上传文件 xff1
  • 疑难杂症之vscode--During startup program exited with code 0xc0000139.--缺失重要文件(杂记)

    问题展示 在vscode中 xff0c 只要用了STL容器 xff0c 就会出现这样的提示 发现自己的 vscode 不能运行带有部分 stl 库的程序 xff0c 编译不会报错 xff0c 运行也不会报错但是也没有结果 xff0c 调试的
  • SpringBoot整合Jcasbin,RESTful,Mysql,入门

    Casbin 是一个权限框架 xff0c 这里就不多赘述了 xff0c 有兴趣自己了解 Casbin xff0c 这里我们使用的是JCasbin 首先需要了解Casbin的Model和Policy xff0c 可以通过这里观察编辑器 xff
  • 聚类联邦学习的拜占庭鲁棒性

    聚类联邦学习的拜占庭鲁棒性 2020 ICASSP On the Byzantine Robustness of Clustered Federated Learning 原文链接 xff1a https ieeexplore ieee o
  • 网络安全学习(十七)VlAN

    虚拟局域网vlan vlan是二层技术 xff0c 路由器上不能配置vlan表 主要应用在交换机上 广播的危害 xff1a 增加网络 终端负担 xff0c 传播病毒 xff0c 安全性 路由器也可以隔离 xff0c 但有缺点 成本高 不灵活
  • 计算机网络 - IPv4 常考知识点详解(超详细!)

    目录 一 IPv4分组 1 IPv4分组的格式 2 IP数据报分片 3 网络层转发分组的流程 二 IPv4地址与NAT 1 IPv4地址 2 NAT 三 子网划分与子网掩码 CIDR 1 子网划分 2 子网掩码 3 CIDR 四 ARP D
  • 浏览器工作原理(超级详解!!!!)

    浏览器工作原理 浏览器的结构 用户界面 gt 浏览器引擎 gt 渲染引擎 渲染引擎上有 网络 js解析器 gt 也称浏览器内核 浏览器引擎上有 xff1a 数据持久层 xff08 帮助浏览器存储数据 如cookie等 xff09 各个浏览器