聊聊事件循环机制

进程和线程

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

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

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

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

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

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

主要进程:

  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渲染进程会经行渲染。
  • 执行栈会去宏任务队列查询是否有任务等待,如果有继续上面的流程。
相关推荐
Moment5 分钟前
从美团全栈化看 AI 冲击:前端转全栈,是自救还是必然 🤔🤔🤔
前端·后端·面试
天问一13 分钟前
使用 Vue Router 进行路由定制和调用的示例
前端·javascript·vue.js
韩立学长2 小时前
【开题答辩实录分享】以《基于Vue的非遗文化知识分享平台的设计与实现》为例进行选题答辩实录分享
前端·javascript·vue.js
优弧2 小时前
离开舒适区100天,我后悔了吗?
前端·后端·面试
胡gh2 小时前
css的臂膀,前端动效的利器,还是布局的“隐形陷阱”?
前端·css·html
灵感菇_2 小时前
Flutter Riverpod 完整教程:从入门到实战
前端·flutter·ui·状态管理
用户21411832636022 小时前
紧急修复!Dify CVE-2025-55182 高危漏洞,手把手教你升级避坑
前端
Vic101013 小时前
解决 Spring Security 在异步线程中用户信息丢失的问题
java·前端·spring
wordbaby3 小时前
Expo (React Native) 最佳实践:TanStack Query 深度集成指南
前端·react native
~无忧花开~3 小时前
Vue二级弹窗关闭错误解决指南
开发语言·前端·javascript·vue.js