当前位置: 首页 > news >正文

【JavaScript】 JS 的单线程和浏览器的多进程架构

概述

此外,JS 最初是为了解决⽹⻚交互的问题⽽诞⽣的,⽽⽹⻚交互的需求⼤部分是基于⽤户事件的,⽐如点击按钮、输⼊⽂本等。这些操作的响应速度要求很⾼,如果在响应事件的同时还要处理其他任务,可能会导致⽹⻚卡顿、响应变慢等⽤户体验不佳的问题。

为了利⽤多核 CPU 的计算能⼒,HTML5 提出 Web Worker 标准,允许 JS 脚本创建多个线程,但是⼦线程完全受主线程控制,且不得操作 DOM。所以,这个新标准并没有改变 JS 单线程的本质。

浏览器的多进程架构

“JS 是单线程的” 指的是执⾏ JS 的线程只有⼀个,是浏览器提供的 JS 引擎线程(主线程)。

如今的主流浏览器都是多进程架构的,以 Chrome 为例,它包含了 1 个浏览器主进程、1个 GPU 进程、1 个⽹络进程、多个渲染进程或多个插件进程。默认情况下,Chrome 会为每个 Tab 标签创建⼀个渲染进程。⼀个渲染进程通常由以下线程组成:

  • JS 引擎线程(主线程):
    JavaScript 引擎,也称为 JS 内核,负责处理 JS 脚本,执⾏代码。当主线程空闲且任务队列不为空时,会依次取出任务执⾏。注意,该线程与 GUI 渲染线程互斥,当 JS 引擎线程执⾏ JS 时间过⻓,将导致⻚⾯渲染的阻塞。
  • GUI 渲染线程:
    主要负责⻚⾯的渲染,解析 HTML、CSS,构建DOM树,布局和绘制等。当界⾯需要重绘或者由于某种操作引发重排时,将执⾏该线程。注意:该线程与 JS 引擎线程互斥,当执⾏ JS 引擎线程时,GUI 线程会被挂起,当任务队列空闲时,主线程才会去执⾏ GUI 渲染。
  • 事件触发线程:
    ⽤于控制事件循环,将准备好的事件交给 JS 引擎线程执⾏。当主线程遇到异步任务,如 setTimeOut(或 ajax 请求、⿏标点击事件),会将它们交由对应的线程处理,处理完毕后,事件触发线程会把对应的事件添加到任务队列的尾部,等待 JS 引擎的处理。注意:由于 JS 的单线程关系,队列中的待处理事件都得排队等待,只有在 JS 引擎空闲时才能被执⾏。
  • 定时器触发线程:
    负责执⾏定时器⼀类函数的线程,如 setTimeout,setInterval 等。主线程依次执⾏代码时,遇到定时器,会将定时器交由该线程进⾏计时,当计时结束,事件触发线程会将定时器的回调函数添加到任务队列的尾部,等待 JS 引擎空闲后执⾏。
  • 异步 http 请求线程:
    负责执⾏异步请求⼀类的函数的线程,如 Promise,axios,ajax 等。主线程依次执⾏代码时,遇到异步请求,会将函数交给该线程处理。当监听到状态码变更,如果设置有回调函数,事件触发线程会将相应的回调函数添加到任务队列的尾部,等待 JS 引擎空闲后执⾏。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • PHP常量
  • 图灵测试:人工智能与人类沟通的界限
  • UniVue@v1.5.0版本发布:里程碑版本
  • linux学习笔记整理: 关于linux:nginx服务器 2024/7/20;
  • Ubuntu Grub引导优化
  • 基于微信小程序+SpringBoot+Vue的校园自助打印系统(带1w+文档)
  • Flowable-SpringBoot项目集成
  • idea2019版本创建JavaWeb项目并配置Tomcat步骤
  • apollo9.0park and go-adjust
  • python-爬虫实例(5):将进酒,杯莫停!
  • Covalent(CXT)运营商网络规模扩大 42%,以满足激增的需求
  • Java练习题 (2024.7.23)
  • C++面试题之判断一个变量是不是指针
  • JavaWeb(4)JavaScript入门2—— JS的对象和JSON
  • 【附源码】Python :校园导航与最短路径算法
  • 【每日笔记】【Go学习笔记】2019-01-10 codis proxy处理流程
  • Angular js 常用指令ng-if、ng-class、ng-option、ng-value、ng-click是如何使用的?
  • CEF与代理
  • conda常用的命令
  • go append函数以及写入
  • Linux快速复制或删除大量小文件
  • Mac 鼠须管 Rime 输入法 安装五笔输入法 教程
  • Spring思维导图,让Spring不再难懂(mvc篇)
  • Webpack入门之遇到的那些坑,系列示例Demo
  • 反思总结然后整装待发
  • 解析 Webpack中import、require、按需加载的执行过程
  • 开年巨制!千人千面回放技术让你“看到”Flutter用户侧问题
  • 理清楚Vue的结构
  • 携程小程序初体验
  • 学习JavaScript数据结构与算法 — 树
  • 一个6年java程序员的工作感悟,写给还在迷茫的你
  • 积累各种好的链接
  • ​比特币大跌的 2 个原因
  • # 日期待t_最值得等的SUV奥迪Q9:空间比MPV还大,或搭4.0T,香
  • $redis-setphp_redis Set命令,php操作Redis Set函数介绍
  • (09)Hive——CTE 公共表达式
  • (1)(1.8) MSP(MultiWii 串行协议)(4.1 版)
  • (30)数组元素和与数字和的绝对差
  • (安卓)跳转应用市场APP详情页的方式
  • (二)linux使用docker容器运行mysql
  • (附源码)springboot家庭装修管理系统 毕业设计 613205
  • (亲测成功)在centos7.5上安装kvm,通过VNC远程连接并创建多台ubuntu虚拟机(ubuntu server版本)...
  • (四)c52学习之旅-流水LED灯
  • (五)大数据实战——使用模板虚拟机实现hadoop集群虚拟机克隆及网络相关配置
  • (原創) 如何動態建立二維陣列(多維陣列)? (.NET) (C#)
  • (转)Sql Server 保留几位小数的两种做法
  • (转)关于如何学好游戏3D引擎编程的一些经验
  • .Net Core 生成管理员权限的应用程序
  • .NET Framework杂记
  • .NET 表达式计算:Expression Evaluator
  • .NET/C# 使用 #if 和 Conditional 特性来按条件编译代码的不同原理和适用场景
  • .NETCORE 开发登录接口MFA谷歌多因子身份验证
  • /bin/bash^M: bad interpreter: No such file ordirectory
  • :not(:first-child)和:not(:last-child)的用法
  • [ vulhub漏洞复现篇 ] AppWeb认证绕过漏洞(CVE-2018-8715)