聊聊事件循环机制

进程和线程

进程:程序运行的独立专属内存空间,每个应用都至少有一个进程,进程之间相互独立,即使要通信也需要双方同意。

线程:进程的一个执行任务(控制单元)负责当前进程中程序的执行,每一个进程都至少有一个线程,所以进程开启后会自动创建一个线程来运行代码,该线程称之为主线程。一个进程中可以包含多个线程

根本区别:进程是操作系统资源分配的基本单位,而线程是处理器任务调度和执行的基本单位

影响关系:一个进程崩溃后,在保护模式下不会对其他进程产生影响,但是一个线程崩溃整个进程都死掉。所以多进程要比多线程健壮。

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

浏览器,是一种多进程多线程的应用程序,在浏览器中打开一个网页相当于新起了一个进程,当然,浏览器也有它自己的优化机制,比方说有五个空白页,这五个空白页会合并成同一个进程。

主要进程:

  1. 浏览器进程: 主要负责界面显示,用户交互,子进程管理等,浏览器进程内部会启动多个线程处理不同的任务。
  2. 网络进程:负责加载网络资源。
  3. 渲染进程:渲染进程启动后会开启一个渲染主线程,主线程负责执行HTML、css、js代码。(前端代码都是在渲染进程执行的)
  4. GPU进程:仅有一个,用于3D绘制。
  5. 第三方插件进程:每一种插件都有一个进程,只有在插件运行时才启动。

浏览器多进程优势

  1. 避免单个页面崩溃造成整个浏览器的卡顿.
  2. 避免第三方插件崩溃影响整个浏览器
  3. 多进程充分利用多核优势

浏览器渲染进程有哪些线程:

  1. GUI渲染线程:- 负责渲染浏览器界面,解析HTML,CSS,构建DOM树和RenderObject树,布局和绘制等。 GUI渲染线程与JS引擎线程是互斥的 ,当JS引擎执行时GUI线程会被挂起,GUI更新会被保存在一个队列中等到JS引擎空闲时立即被执行。
  2. JS引擎线程:也称为JS内核,负责处理Javascript脚本程序,JS引擎一直等待着任务队列中任务的到来,然后加以处理
  3. 事件触发线程:用来控制事件循环。
  4. 定时触发器线程:setIntervalsetTimeout所在线程,浏览器定时计数器并不是由JavaScript引擎计数的,(因为JavaScript引擎是单线程的, 如果处于阻塞线程状态就会影响记计时的准确)
  5. 异步http请求线程:在XMLHttpRequest在连接后是通过浏览器新开一个线程请求

从Event Loop谈JS的运行机制

  • JS分为同步任务和异步任务
  • 异步任务可以分为宏任务(macrotask)和微任务(microtask)
  • 同步任务都在主线程上执行,形成一个执行栈
  • 事件触发线程 管理着两个任务队列,分别为宏任务队列和微任务队列。

事件循环的流程:在事件循环中,每进行一次循环操作称为 tick,关键步骤如下:

  • 执行栈执行同步任务
  • 同步任务执行完后,会询问微任务队列是否有任务,如果有就就执行微任务队列直到清空。
  • 当微任务队列执行完后,GUI渲染进程会经行渲染。
  • 执行栈会去宏任务队列查询是否有任务等待,如果有继续上面的流程。
相关推荐
东方小月9 小时前
从零开发一个 Coding Agent(四):使用状态机校验大模型事件流
前端·人工智能·后端
Csvn9 小时前
🧩 ESM vs CJS 混用的 7 个「天坑」——从 TypeScript 编译到 Node 与浏览器
前端
Csvn9 小时前
🎯 Web 性能 API 集合:Performance Observer 的 5 个冷门妙用
前端
Csvn9 小时前
深入 React 闭包陷阱:从根源上理解并根治 stale closure
前端
whyfail10 小时前
前端学 Spring Boot(8):接口为什么越用越慢?
前端·spring boot·后端
用户0595401744610 小时前
LangChain 记忆测试踩坑实录:这两个坑让我排查了 4 小时
前端·css
程序员黑豆10 小时前
鸿蒙应用开发:@Monitor 装饰器使用教程
前端·harmonyos
SamChan9011 小时前
在Web应用中集成PDF多语言翻译功能:PDFTranslator API实战指南
前端·python·ai·pdf·yapi·机器翻译
kyriewen11 小时前
AI Agent 9秒删光了生产数据库——我给自己的项目做了5个紧急检查
前端·ai编程·claude
IT_陈寒11 小时前
JavaScript的this又双叒叕让我怀疑人生了
前端·人工智能·后端