浏览器的事件轮询(消息轮询)

2023-11-10

目录

浏览器的进程模型

何为进程?

何为线程?

浏览器有哪些进程和线程?

渲染主线程是如何⼯作的?

相关问题

何谓异步

JS为什么会阻塞渲染

JS 中的计时器为什么无法精确计时?

任务队列与优先级


浏览器的进程模型

何为进程?

程序运⾏需要有它⾃⼰专属的内存空间,可以把这块内存空间简单的理解为进程。

每个应⽤⾄少有⼀个进程,进程之间相互独⽴,即使要通信,也需要双⽅同意。

何为线程?

有了进程后,就可以运⾏程序的代码了。
运⾏代码的单位我们称之为「线程」。
⼀个进程⾄少有⼀个线程,所以在进程开启后会⾃动创建⼀个线程来运⾏代码,该线程称之为主线程。
如果程序需要同时执⾏多块代码,主线程可以启动更多的线程来执⾏代码,所以⼀个进程中可以包含多个线程。

浏览器有哪些进程和线程?

浏览器是⼀个多进程多线程的应⽤程序( 可以在浏览器的任务管理器中查看当前的所有进程
浏览器内部⼯作极其复杂,为了避免相互影响,减少连环崩溃的⼏率,当启动浏览器后,它会⾃动启动多个进程。
其中,最主要的进程有:
  1. 浏览器进程:主要负责界⾯显示、⽤户交互、⼦进程管理等。浏览器进程内部会启动多个线程处理不同的任务。
  2. ⽹络进程 :负责加载⽹络资源。⽹络进程内部会启动多个线程来处理不同的⽹络任务。
  3. 渲染进程 :(本文重点讲解的进程)渲染进程启动后,会开启⼀个渲染主线程,主线程负责执⾏ HTMLCSS、JS 代码。 默认情况下,浏览器会为每个标签⻚开启⼀个新的渲染进程,以保证不同的标签⻚之间不相互影响。

渲染主线程是如何⼯作的?

渲染主线程是浏览器中最繁忙的线程,需要它处理的任务包括但不限于:

  • 解析 HTML
  • 解析 CSS
  • 计算样式
  • 布局
  • 处理图层
  • 每秒把⻚⾯画 60
  • 执⾏全局 JS 代码
  • 执⾏事件处理函数
  • 执⾏计时器的回调函数
  • ......

要处理这么多的任务,主线程遇到了一个避不开的难题:如何调度任务?

例如:

  • 我正在执⾏⼀个 JS 函数,执⾏到⼀半的时候⽤户点击了按钮,我该⽴即去执⾏点击事件的处理函数吗?
  • 我正在执⾏⼀个 JS 函数,执⾏到⼀半的时候某个计时器到达了时间,我该⽴即去执⾏它的回调吗?
  • 浏览器进程通知我⽤户点击了按钮”,与此同时,某个计时器也到达了时间,我应该处理哪⼀个呢?
  • ......
渲染主线程的解决方案:排队

1. 在最开始的时候,渲染主线程会进⼊⼀个⽆限循环

2. 每⼀次循环会检查消息队列中是否有任务存在。如果有,就取出第⼀个任务执⾏,执⾏完⼀个后进⼊下⼀次循环;如果没有,则进⼊休眠状态。

3. 其他所有线程(包括其他进程的线程)可以随时向消息队列添加任务。新任务会加到消息队列的末尾。在添加新任务时,如果主线程是休眠状态,则会将其唤醒以继续循环拿取任务
这样一个往复轮询的过程被称之为: 事件循环(消息循环)

相关问题

何谓异步

代码在执⾏过程中,会遇到⼀些⽆法⽴即处理的任务,⽐如:
  • 计时完成后需要执⾏的任务 —— setTimeout setInterval
  • ⽹络通信完成后需要执⾏的任务 -- XHR Fetch
  • ⽤户操作后需要执⾏的任务 -- addEventListener
如果让渲染主线程等待这些任务的执行时机达到,就会导致主线程⻓期处于 「阻塞」的状态,从⽽导致浏览器「卡死」
渲染主线程承担着极其重要的⼯作,⽆论如何都不能阻塞!比如用户操作了页面,但是相应的渲染任务却被阻塞,就会在用户眼里造成卡死的假象。因此,浏览器选择 异步 来解决这个问题。

JS为什么会阻塞渲染

首先浏览器拿到一个HTML文件到渲染成页面会经过HTML 解析、样式计算、布局、分层、绘制、分块、光栅化、画、这几个流程的处理。

主线程在HTML 解析的过程中有一个细节,就是如果遇到 script 标签会停止解析 HTML,转而等待 JS 文件下载好,并将全局代码解析执行完成后,才能继续解析 HTML。

渲染任务后期会交给合成线程处理,合成线程处理好后会将其处理结果包装成任务丢到任务队列中排队

主线程在执行当前任务后才会去完成任务队列的任务。

总结:JS执行和渲染都是任务,主线程在执行JS的时候渲染任务在任务队列中排队,JS的执行事件即排队时间即阻塞时间

JS 中的计时器为什么无法精确计时?

本质上跟上一个问题是一样的,定时任务由定时触发器线程异步触发后将异步任务的回调包装成任务丢入到异步任务队列,而异步任务队列中任务的执行时间直接受主线程当前正在执行任务的执行时间影响

任务队列与优先级

过去把消息队列简单分为宏队列和微队列,这种说法⽬前已⽆法满⾜复杂的浏览器环境,取⽽代之的是⼀种更加灵活多变的处理⽅式。
根据 W3C 官⽅的解释,现在的做法是给每个任务加上任务类型标记。
同类型的任务必须在同⼀个队列,不同的任务可以属于不同的队列(青菜、萝卜可以分别放两个框里,也可以放一个框里,但是把青菜或萝卜放在多个框里不行)。
规范只声明了浏览器必须有⼀个微队列,微队列的任务⼀定具有最⾼的优先级,必须优先调度执⾏。其他任务队列的数量和顺序由浏览器厂商自主实现,所以不同浏览器可能存在差异。

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

浏览器的事件轮询(消息轮询) 的相关文章

  • 如何动态更改表格单元格文本颜色?

    我需要一个解决方案来通过 javascript 动态更改表格单元格的文本颜色 文本可以是以下颜色 蓝色 绿色 红色和黑色 表示例
  • 如何在测试用例失败时在量角器中截取屏幕截图

    我是量角器的新手 想在浏览器中截取失败的测试用例的屏幕截图 您能帮我建议一下我该怎么做吗 谢谢 您可以使用protractor jasmine2 screenshot reporter为此 它有一些很好的功能可以满足您的目的 var Htm
  • JavaScript 调用函数

    我最近一直在测试一些代码 试图更好地理解 javascript 然后我遇到了call 我无法很好地理解的功能 我有以下代码 function hi console log hi var bye function param param2 c
  • 停止 jQuery 循环设置 display:none;

    我正在创建一个小游戏 用户从一组项目中进行选择 然后对所选项目进行洗牌并选择一个 我正在使用 jQuery 循环 http jquery malsup com cycle http jquery malsup com cycle 运行主动画
  • 输入值返回 NaN

    如果有人可以帮助我 因为我不知道为什么控制台中总是有 NaN 一切似乎都很好 该代码应该获取输入值并进行简单的计算 不幸的是 我收到了 NaN 所以我决定使用 console log 来探索值 它向我解释了每个输入的值都是 NaN 我认为这
  • Node.js npm mssql 函数返回未定义

    我使用 mssql 和 node js 连接到 sql server 数据库 我试图通过将连接代码包装在具有一个查询参数的函数中来减少代码 当我从 router get 函数中的 with 调用该函数时 它返回未定义 任何帮助将非常感激 f
  • Leaflet.js setMaxBounds 忽略南界

    Using 传单 js http leafletjs com reference html对于开源地图项目 但我需要设置用户无法超越的特定界限 地图对象的 maxBounds 属性在北 东 西方向上按预期工作 但它让我永远向南滚动 在小提琴
  • 音频端播放新文件

    我有一个webapp https radio repjesus com当您使用 ajax jquery 单击链接时加载并播放音轨 一切正常 但当曲目结束时 曲目将设置为循环 并且这种情况可以永远持续下去 我希望播放器从数据库中自动加载随机曲
  • 尝试在 Windows 上执行 package.json 中的脚本会引发 JScript 错误

    所以我正在尝试构建 javascriptair site 在 的里面package json有一个 npm 脚本指向 javascript 命令 package scripts 找到该存储库https github com kentcdod
  • 在 Angular 中将图像 url 转换为 base64

    我正在努力尝试将给定的图像 url 转换为 base64 在我的例子中 我有一个带有图像路径的字符串 var imgUrl assets logoEmpresas empresa logoUrl 我如何直接将给定的图像网址转换为base64
  • Postman如何发送请求? ajax,同源策略

    我发现了这个非常有用的 Chrome 扩展程序 名为 Postman 这是一个非常有用的扩展 特别是当您正在编写 RESTful 应用程序时 我感到困惑的一件事是这个插件 扩展如何能够在不同的域上成功发送 POST 请求 我尝试像这样使用
  • Ember 未在生产环境中加载某些图像

    我有一个 Ember cli 1 13 应用程序 它在公共目录中存储了很多图像 现在 它将正确加载除特定组件中的图像之外的所有图像 该组件的调用方式如下 list item url list url name List Name price
  • JavaScript 中 == 和 === 的区别[重复]

    这个问题在这里已经有答案了 有什么区别 and 在 JavaScript 中 我也见过 and 运营商 还有更多这样的运营商吗 看看这里 http longgoldenears blogspot com 2007 09 triple equ
  • 设备收到 GCM Android 通知但未显示

    尽管通知已在应用程序本身中注册 但我的 Ionic Android 应用程序的 GCM Cloud 消息通知未出现在我的设备的主屏幕中 我正在使用 npm 模块node gcm https www npmjs com package nod
  • JavaScript 排序列表

    Javascript 或 jQuery 中有排序列表吗 我有一个巨大的列表 随着时间的推移 插入操作很少 每次添加单个项目时 我无法为整个列表调用 object sort 我需要插入 o log n 不 没有 你拥有的只是Array sor
  • ImmutableJS:合并两个对象列表,而不重复它们

    假设我有以下内容 var allFoods Immutable List var frenchFood Immutable List type french fries price 3 type petit gateau price 40
  • 删除鼠标悬停时的 Vue 自定义过滤器

    我想使用 VueJS 2 删除鼠标悬停时的截断过滤器 这是模板中的过滤器 div class eng word english truncate div 这是过滤器本身 filters truncate function value let
  • 如何从对象 URL 获取文件或 blob?

    我允许用户通过拖放和其他方法将图像加载到页面中 当图像被删除时 我正在使用URL createObjectURL转换为对象 URL 以显示图像 我不会撤销该网址 因为我会重复使用它 所以 当需要创建一个FormData对象 以便我可以允许他
  • Dojo 是否可以与其他 JS 框架结合?

    我们使用 Dojo 1 9 3 作为构建单页面应用程序的 JS 框架 然而 我们在 Dojo 的怪癖上花费了太多时间 因此即使是简单的任务也需要很长时间才能实现 由于缺乏适当的文档 我们经常不得不求助于阅读源代码 然后实施解决方法 我觉得如
  • JavaScript 有内置的 stringbuilder 类吗?

    I see a few 代码项目解决方案 http www codeproject com KB scripting stringbuilder aspx 但是JavaScript中有常规的实现吗 如果您必须为 Internet Explo

随机推荐

  • 输出从顶点Vi到Vj的所有简单路径

    class Solution public bool visited 20 void init for int i 0 i lt 20 i visited i false int firstarc vector
  • 导出下载csv格式的表格(逗号分隔文件)的servlet代码,留待以后调用

    导出并下载csv格式的表格 逗号分隔文件 以导出销售榜单为例 package cn estore web servlet import java io IOException import java io PrintWriter impor
  • 使用aop获取方法运行之后的返回值

    AfterReturning returning rvt pointcut annotation com roton common utils LogRecord public Object AfterExec JoinPoint join
  • 机器学习洞察

    在之前的 机器学习洞察 系列文章中 我们分别针对于多模态机器学习和分布式训练 无服务器推理进行了解读 本文将为您重点介绍 JAX 的发展并剖析其演变和动机 下面 就让我们来认识一下 JAX 这一新崛起的深度学习框架 亚马逊云科技开发者社区为
  • Jenkins安装配置及插件安装使用

    个人理解持续集成 为解决程序代码提交质量低 提交内容导致原有系统的BUG 按时或按需自动编译版本 进行自动化测试 百度对持续集成的定义 持续集成是一种软件开发实践 即团队开发成员经常集成他们的工作 通常每个成员每天至少集成一次 也就意味着每
  • MySQL监控工具PMM

    MySQL监控工具PMM PMM 安装server端 添加agent 配置agent 添加MySQL监控 查看客户端组件状态 大致内容 参考链接 PMM PMM Percona Monitoring and Management 是一个免费
  • qTip2 Events

    author YHC 绑定事件 这个API触发一些特殊的事件 以下详细信息 允许你给qTip分配多个时间监听 和为某一事件做出响应 例如 我们绑定一个事件句柄 它将侦听qTip的移动的事件 和更新DIV元素里面显示的qTip的坐标内容 se
  • 【满分】【华为OD机试真题2023 JS】微服务的集成测试

    华为OD机试真题 2023年度机试题库全覆盖 刷题指南点这里 微服务的集成测试 知识点深搜 时间限制 1s 空间限制 256MB 限定语言 不限 题目描述 现在有n个容器服务 服务的启动可能有一定的依赖性 有些服务启动没有依赖 其次服务自身
  • 现在公司都不缺人了?软件测试工作经历3年,居然被坑了?防不胜防!

    我的情况 大概介绍一下个人情况 女 本科 三年多测试工作经验 懂python 会写脚本 会selenium 会性能 然而到今天都没有收到一份offer 从年后就开始准备简历 年后上班的第一天就开始投 开始只是投了一些官网已久的岗位 并没有收
  • Keras中model.evaluate()返回的是 loss value & metrics values

    Keras官方文档 https keras io models model evaluate Keras中model evaluate 返回的是 损失值和你选定的指标值 例如 精度accuracy evaluate evaluate x N
  • Spring事务管理: 构建稳健的数据库事务处理

    博主猫头虎 带您 Go to New World 博客首页 猫头虎的博客 面试题大全专栏 文章图文并茂 生动形象 简单易学 欢迎大家来踩踩 IDEA开发秘籍专栏 学会IDEA常用操作 工作效率翻倍 100天精通Golang 基础入门篇 学会
  • SpringBoot入门到精通(四):整合JDBC和JPA

    整合JDBC JdbcTemplate JPA 当前环境说明 Windows10 64 Maven3 x JDK1 8 MySQL5 6 SpringToolSuite4 Spring官方提供的开发工具 实际就是一个Eclipse 一 整合
  • 必看!!!客户端requests与服务端request收发请求

    当使用代码进行接口访问的时候 请求的发送与请求的接受使用的参数应该怎么如何传输能够请求到正确的响应呢 一 使用GET请求发送 客户端与服务端的参数传输与接受 1 服务端 首先使用web框架写一个简单的接口 接收两个参数 page和size
  • 网络原理TCP/UDP

    文章目录 TCP TCP协议段格式 可靠机制 确认应答机制 超时重传机制 连接管理机制 建立连接 三次握手 断开连接 四次挥手 常见问题 效率机制 滑动窗口 流量控制机制 拥塞控制 延迟应答 捎带应答 粘包问题 应用层的数据包 TCP与UD
  • 源码(二进制)安装kuberbetes(k8s) (完整版-持续完善)

    环境配置 1 分别设置hostname hostnamectl set hostname master hostnamectl set hostname node01 hostnamectl set hostname node02 2 主机
  • 从42亿个不重复的4字节整数中判断一个数是否存在

    include
  • RuoYi项目中VUE表单修改表单中数据回显下拉选项或者单选出现异常

    若依项目中有一个功能就是字典 字典可以让我们不需要修改前端代码的情况下实现表单中下拉选项文字 单选 多选按钮的文字变更 但也会遇到各种各样的问题 后端传递的某个字段的值是数字类型的值 但是字典里面的确实字符串的值 不可能让后端传递字符串的值
  • OpenCV实现SfM(一):双目三维重建(包含SIFT特征点提取)

    三维重建介绍 三维重建是指根据基于一个视图或者多个视图所获得的物体或者场景的图像重建三维模型的过程 由于单视图的信息很单一 因此三维重建需要更复杂的算法和过程 相比之下 多视图的三维重建 模仿人类观察世界的方式 就比较容易实现 其方法是先对
  • Uni-App开发框架介绍

    Uni App开发框架介绍 1 Uni App简介 Uni App是一家公司 DCloud 产品 公司承诺将一直开源且免费 公司旗下有4个产品 HBuilder X 开发工具 uni app 跨平台统一框架 uniCloud 云服务提供商
  • 浏览器的事件轮询(消息轮询)

    目录 浏览器的进程模型 何为进程 何为线程 浏览器有哪些进程和线程 渲染主线程是如何 作的 相关问题 何谓异步 JS为什么会阻塞渲染 JS 中的计时器为什么无法精确计时 任务队列与优先级 浏览器的进程模型 何为进程 程序运 需要有它 专属的