聊聊事件循环机制

进程和线程

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

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

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

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

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

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

主要进程:

  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渲染进程会经行渲染。
  • 执行栈会去宏任务队列查询是否有任务等待,如果有继续上面的流程。
相关推荐
腾讯TNTWeb前端团队1 小时前
helux v5 发布了,像pinia一样优雅地管理你的react状态吧
前端·javascript·react.js
范文杰4 小时前
AI 时代如何更高效开发前端组件?21st.dev 给了一种答案
前端·ai编程
拉不动的猪4 小时前
刷刷题50(常见的js数据通信与渲染问题)
前端·javascript·面试
拉不动的猪4 小时前
JS多线程Webworks中的几种实战场景演示
前端·javascript·面试
FreeCultureBoy5 小时前
macOS 命令行 原生挂载 webdav 方法
前端
uhakadotcom6 小时前
Astro 框架:快速构建内容驱动型网站的利器
前端·javascript·面试
uhakadotcom6 小时前
了解Nest.js和Next.js:如何选择合适的框架
前端·javascript·面试
uhakadotcom6 小时前
React与Next.js:基础知识及应用场景
前端·面试·github
uhakadotcom6 小时前
Remix 框架:性能与易用性的完美结合
前端·javascript·面试
uhakadotcom6 小时前
Node.js 包管理器:npm vs pnpm
前端·javascript·面试