事件循环 -- 资源总结(浏览器进程模型、事件循环机制、练习题)

!!! 理解学习,有问题/补充欢迎指出,随时改正 !!!

事件循环

    • 一、进程与线程
    • 二、浏览器进程模型
    • 三、为什么会存在事件循环机制
    • 四、事件循环机制
    • 五、代码场景模拟事件循环机制
    • 六、练习题(明天补充...)

一、进程与线程

  • 进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配的基本单位,是操作系统结构的基础。简单的理解:操作系统分配给程序执行的一块独立的内存空间,进程间通讯相互独立
  • 线程(thread)是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。简单理解:进程启动时会启动一个主线程用于程序运行,进程可以同时开启多个线程,主线程关闭后进程会被杀死释放内存

二、浏览器进程模型

  • 浏览器内部十分复杂,启动浏览器打开浏览器任务管理器可以发现,浏览器是多进程的应用程序。举例但不限于:浏览器进程网络进程渲染进程存储进程音频进程
  • 浏览器进程:主要职责:浏览器“外壳”功能控制,协调各进程的指挥中心
  • 网络进程:加载网络资源,网络请求的处理是涉及多个进程协作,虽然有专门的网络进程,但浏览器进程和渲染进程也会参与其中
  • 渲染进程!!!单线程,一个标签页代表着一个渲染进程,用于处理html/css/js渲染界面
    在这里插入图片描述

三、为什么会存在事件循环机制

这里我更倾向理解成:浏览器对于执行任务顺序的分配机制,保证资源的最优占用

  • 任务是在渲染线程中进行处理,由于渲染线程为单一线程,如果所有任务均需同步按序执行,且存在需要等待资源/时间…的任务会导致渲染进程阻塞
  • 阻塞会导致渲染线程卡死,交互无响应,资源浪费等问题,为了解决任务性质上的阻塞问题,实现了事件循环

四、事件循环机制

  • Chrome源码中,会开启一个不会结束的for循环,每次循环从消息队列去除第一个任务执行,而其他线程只需在合适的时候将任务加入到队列末尾 – 来自大佬的解读
  • 现针对于队列的命名方式有不同看法,个人看法:无论是宏/微任务还是微/延时/交互队列。都可以理解为渲染进程是根据任务执行队列的权重来排序执行。一类任务必须在同一队列,一个队列可以有不同任务类型

五、代码场景模拟事件循环机制

方便同一理解,这里就采用老朋友promise(微任务/微队列)和setTimeout(宏任务/延时队列)来模拟

	Promise.resolve().then(() => {console.log(2);setTimeout(() => { console.log(5)},0)})console.log(1);setTimeout(() => {console.log(3);Promise.resolve().then(() => {console.log(4);})}, 0);//log 1,2,3,4,5
//第一次循环
/*
微任务队列:[{console.log(2);setTimeout(() => { console.log(5)},0)
}]
同步任务:console.log(1); 进入渲染主线程
其它队列:[{console.log(3);Promise.resolve().then(() => {console.log(4);})
}]打印:1
*/
//第二次循环
/*
同步任务执行结束,开始读取微任务队列
同步任务:console.log(2) // 渲染线程执行任务后发现,setTimeout产生新任务到其它队列(理解为:宏任务/延时队列)
其它队列:[{console.log(3);Promise.resolve().then(() => {console.log(4);})},{setTimeout(() => { console.log(5)},0)}
]打印:1,2
*/
//第三次循环
/*
当前状态同步任务和微任务均无排队,开始执行其它队列(理解为:宏任务/延时队列)
同步任务:console.log(3); // 渲染线程执行任务后发现,产生新的微任务,放入微任务队列
微任务队列:[{Promise.resolve().then(() => {console.log(4);})
}]
其它队列:[{setTimeout(() => { console.log(5)},0)
}]打印:1,2,3
*/
//第四次循环
/*
渲染线程空闲,优先读取微任务队列执行
同步任务:console.log(4); // 执行后,此时同步任务与微任务队列都执行结束
其它队列:[{setTimeout(() => { console.log(5)},0)
}]打印:1,2,3,4
*/
//第五次循环
/*此时渲染主线程和微任务队列都执行完毕,仅剩其它队列(理解为:宏任务/延时队列)存在任务执行
同步任务:console.log(5);打印:1,2,3,4,5
*/

六、练习题(明天补充…)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/470611.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

九州未来再度入选2024边缘计算TOP100

随着数智化转型的浪潮不断高涨,边缘计算作为推动各行业智能化升级的重要基石,正在成为支持万物智能化的关键点。近日,德本咨询(DBC)联合《互联网周刊》(CIW)与中国社会科学院信息化研究中心(CIS),共同发布《2024边缘计算TOP100》榜…

使用 start-local 脚本在本地运行 Elasticsearch

警告:请勿将这些说明用于生产部署 本页上的说明仅适用于本地开发。请勿将此配置用于生产部署,因为它不安全。请参阅部署选项以获取生产部署选项列表。 使用 start-local 脚本在 Docker 中快速设置 Elasticsearch 和 Kibana 以进行本地开发或测试。 此设…

【Linux】TCP原理

tcp协议段格式 源/目的端口号: 表示数据是从哪个进程来, 到哪个进程去;4 位 TCP 报头长度: 表示该 TCP 头部有多少个 32 位 bit(有多少个 4 字节); 所以TCP 头部最大长度是 15 * 4 6016 位校验和: 发送端填充, CRC 校验. 接收端校验不通过, 则认为数据有问题. 此处的检验和不光…

阿里巴巴通义灵码推出Lingma SWE-GPT:开源模型的性能新标杆

阿里巴巴通义灵码团队最近开源了一款名为Lingma SWE-GPT的自动化软件改进模型。这一模型在软件工程领域的应用中表现出色,首次在SWE-bench基准测试中达到了30.20%的解决率,这一成绩比Llama 3.1 405B高出22.76%,标志着开源模型在这一领域的重大…

MySQL Workbench导入数据比mysql命令行慢

1.数据量 包含2812979条数据的csv文件 2.myql命令行用LOAD DATA INFILE命令导入 耗时1分钟13秒 3.用MySQL Workbench导入 从第一天晚上22点到次日下午16点才导入了45万条数据 4.原因 MySQL Workbench导入csv数据是使用自带的python和一系列的python代码,而mys…

Redis高可用-主从复制

这里写目录标题 Redis主从复制主从复制过程环境搭建从节点配置常见问题主从模式缺点 Redis主从复制 虽然 Redis 可以实现单机的数据持久化,但无论是 RDB 也好或者 AOF 也好,都解决不了单点宕机问题,即一旦 redis 服务器本身出现系统故障、硬…

VMware虚拟机安装Win7专业版保姆级教程(附镜像包)

一、Win7镜像下载: 链接:https://pan.baidu.com/s/1tvN9hXCVngUzpIC6b2OGrA 提取码:a66H 此镜像为Win7专业版(收藏级镜像 已自用几年),官方纯净系统没有附带任何其他第三方软件。 二、配置虚拟机 1.创建新的虚拟机。 这里我们以最新的VMware…

【C++】C++11特性(上)

✨✨欢迎大家来到Celia的博客✨✨ 🎉🎉创作不易,请点赞关注,多多支持哦🎉🎉 所属专栏:C 个人主页:Celias blog~ 目录 一、列表初始化 二、std::initializer_list 三、右值引用和移…

jmeter常用配置元件介绍总结之定时器

系列文章目录 安装jmeter jmeter常用配置元件介绍总结之定时器 5.定时器5.1.固定定时器5.2.统一随机定时器5.3.Precise Throughput Timer5.4.Constant Throughput Timer5.5.Synchronizing Timer5.6.泊松随机定时器5.7.高斯随机定时器 5.定时器 5.1.固定定时器 固定定时器Cons…

【含开题报告+文档+PPT+源码】基于Spring Boot智能综合交通出行管理平台的设计与实现

开题报告 随着城市规模的不断扩大和交通拥堵问题的日益严重,综合交通出行管理平台的研究与实现显得尤为重要。现代城市居民对于出行的需求越来越多样化,对于交通信息的获取和处理能力也提出了更高的要求。传统的交通管理方式已经难以满足这些需求&#…

并发基础:(淘宝笔试题)三个线程分别打印 A,B,C,要求这三个线程一起运行,打印 n 次,输出形如“ABCABCABC....”的字符串【举一反三】

🚀 博主介绍:大家好,我是无休居士!一枚任职于一线Top3互联网大厂的Java开发工程师! 🚀 🌟 在这里,你将找到通往Java技术大门的钥匙。作为一个爱敲代码技术人,我不仅热衷于探索一些框架源码和算法技巧奥秘,还乐于分享这些宝贵的知识和经验。 💡 无论你是刚刚踏…

万字长文解读深度学习——ViT、ViLT、DiT

文章目录 🌺深度学习面试八股汇总🌺ViT1. ViT的基本概念2. ViT的结构与工作流程1. 图像分块(Image Patch Tokenization)2. 位置编码(Positional Encoding)3. Transformer 编码器(Transformer En…

嵌入式硬件杂谈(一)-推挽 开漏 高阻态 上拉电阻

引言:对于嵌入式硬件这个庞大的知识体系而言,太多离散的知识点很容易疏漏,因此对于这些容易忘记甚至不明白的知识点做成一个梳理,供大家参考以及学习,本文主要针对推挽、开漏、高阻态、上拉电阻这些知识点的学习。 目…

使用jmeter查询项目数据库信息,保存至本地txt或excel文件1108

知识点1:使用jmeter把项目数据库的数据导出,并使用jmeter导出数据库的数据 步骤1:使用jmeter把项目数据库的数据导出 (1)测试计划-添加- 线程组setUp线程组 setUp线程组:添加-配置元件-JDBC Connection …

Flink_DataStreamAPI_输出算子Sink

Flink_DataStreamAPI_输出算子Sink 1连接到外部系统2输出到文件3输出到Kafka4输出到MySQL(JDBC)5自定义Sink输出 Flink作为数据处理框架,最终还是要把计算处理的结果写入外部存储,为外部应用提供支持。 1连接到外部系统 Flink的D…

01-Ajax入门与axios使用、URL知识

欢迎来到“雪碧聊技术”CSDN博客! 在这里,您将踏入一个专注于Java开发技术的知识殿堂。无论您是Java编程的初学者,还是具有一定经验的开发者,相信我的博客都能为您提供宝贵的学习资源和实用技巧。作为您的技术向导,我将…

HarmonyOS Next星河版笔记--界面开发(4)

布局 1.1.线性布局 线性布局通过线性容器column和row创建 column容器:子元素垂直方向排列row容器:子元素水平方向排列 1.1.1.排布主方向上的对齐方式(主轴) 属性:.justifyContent(枚举FlexAlign&#…

webpack loader全解析,从入门到精通(10)

webpack 的核心功能是分析出各种模块的依赖关系,然后形成资源列表,最终打包生成到指定的文件中。更多复杂的功能需要借助 webpack loaders 和 plugins 来完成。 1. 什么是 Loader Loader 本质上是一个函数,它的作用是将某个源码字符串转换成…

如何用WordPress和Shopify提升SEO表现?

选择合适的建站程序对于SEO优化非常重要。目前,WordPress和Shopify是两种备受推崇的建站平台,各有优势。 WordPress最大的优点是灵活性。它支持大量SEO插件,帮助你调整元标签、生成站点地图、优化内容结构等。这些功能让你能够轻松地提升网站…

ArcGIS Pro属性表乱码与字段名3个汉字解决方案大总结

01 背景 我们之前在使用ArcGIS出现导出Excel中文乱码及shp添加字段3个字被截断的情况,我们有以下应对策略: 推荐阅读:ArcGIS导出Excel中文乱码及shp添加字段3个字被截断? 那如果我们使用ArGIS Pro出现上述问题,该如何…