【JavaScript】 JS 的单线程和浏览器的多进程架构
创始人
2024-12-15 07:07:08
0

概述

此外,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 引擎空闲后执⾏。

相关内容

热门资讯

教程辅助“老k游戏辅助”有挂总... 老k游戏辅助开挂教程视频分享装挂详细步骤在当今的网络游戏中,老k游戏辅助作为一种经典的娱乐方式,吸引...
推荐十款“反杀大厅辅助”HH平... 推荐十款“反杀大厅辅助”HH平台挂(带开挂辅助软件第三方教程);无需打开直接搜索薇:13670430...
透视实锤!丽水都莱辅助器,微乐... 透视实锤!丽水都莱辅助器,微乐小程序自建房辅助器下载(透视)开挂辅助平台普及教程 了解更多开挂安装加...
教程辅助“微信小程序雀神挂件辅... 教程辅助“微信小程序雀神挂件辅助”有挂技巧开挂辅助安装大神讲解;无需打开直接搜索加薇13670430...
让我来分享经验“玩吧辅助工具”... 让我来分享经验“玩吧辅助工具”wepoker有没有辅助(带开挂辅助平台详细教程!)玩吧辅助工具ai黑...
透视真的!衢州都莱辅助器是真的... 【亲,衢州都莱辅助器是真的假的 这款游戏可以开挂的,确实是有挂的,很多玩家在这款衢州都莱辅助器是真的...
教程辅助“大菠萝789辅助”有... 您好:大菠萝789辅助这款游戏可以开挂的,确实是有挂的,很多玩家在这款游戏中打牌都会发现很多用户的牌...
透视透视!博雅西苑曲靖棋牌辅助... 博雅西苑曲靖棋牌辅助是一款可以让一直输的玩家,快速成为一个“必胜”的ai辅助神器,有需要的用户可以加...
指导大家“创乐源辅助软件”约局... 指导大家“创乐源辅助软件”约局吧开挂神器是真的吗(带开挂辅助下载解说技巧);无需打开直接搜索薇:13...
教程辅助“山西扣点点辅助下载”... 教程辅助“山西扣点点辅助下载”有挂分享开挂辅助软件必胜教程1、下载安装好山西扣点点辅助下载,进入游戏...