聊聊事件循环机制

进程和线程

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

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

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

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

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

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

主要进程:

  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渲染进程会经行渲染。
  • 执行栈会去宏任务队列查询是否有任务等待,如果有继续上面的流程。
相关推荐
Jay叶湘伦4 分钟前
【极简】用 Vue 写一个 ChatGPT 前端应用,支持连续对话、Markdown 渲染与本地记忆
前端·vue.js·chatgpt
大家的林语冰4 分钟前
《前端周刊》尤大官宣 Vite 8 稳定版首发!npm 新官网?React 官网更新。focusgroup 新功能!
前端·javascript·vite
kuuailetianzi6 分钟前
构建企业级督办任务系统:Vue3 + TypeScript 实战(多级任务拆解+批量操作+进度追踪+单元格合并)
前端·javascript·typescript
Hilaku9 分钟前
王自如公开招聘全栈前端,要求有多离谱?
前端·javascript·ai编程
大漠_w3cpluscom20 分钟前
CSS 技巧:CSS 中选择 html 元素的各种奇技淫巧
前端·css·weui
吴声子夜歌43 分钟前
JavaScript——异步编程
开发语言·前端·javascript
陈随易1 小时前
农村程序员聊五险一金
前端·后端·程序员
恋猫de小郭1 小时前
Swift 6.3 正式发布支持 Android ,它能在跨平台发挥什么优势?
android·前端·flutter
xujing_061 小时前
跑马灯组件vue3+es6
前端·javascript·es6
小小善后师1 小时前
告别周报烦恼:我用 200 行代码打造了一个 AI 工时助手
前端