聊聊事件循环机制

进程和线程

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

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

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

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

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

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

主要进程:

  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渲染进程会经行渲染。
  • 执行栈会去宏任务队列查询是否有任务等待,如果有继续上面的流程。
相关推荐
英俊潇洒美少年1 小时前
Vue 生产环境打包:SourceMap、压缩、混淆、加密全解 + 最佳实践
前端·javascript·vue.js
巴博尔2 小时前
UNIAPP中NVUE页面 动画
android·前端·javascript·ios·uni-app
她说人狗殊途4 小时前
基于 vue-cli 创建
前端·javascript·vue.js
AZaLEan__5 小时前
前端移动端适配与 Bootstrap
前端·bootstrap·html
大家的林语冰5 小时前
Deno 2.8 正式发布,再次超越 Bun,史上最大的次版本升级诞生!
前端·javascript·node.js
渣渣xiong5 小时前
从零开始:前端转型AI agent直到就业第五十七天-第五十八天
前端·人工智能·python
AI周红伟5 小时前
周红伟:长鑫科技(CXMT)财务全景分析
前端·chrome·科技
excel6 小时前
JS 正则在多次 test() 时为什么会出现 lastIndex 缓存问题?
前端
IT_陈寒6 小时前
为什么 Java 的 Optional 让我调试到深夜?
前端·人工智能·后端
米丘6 小时前
React 19.x 的 lazy 与 Suspense
前端·javascript·react.js