• 浏览器线程


    浏览器基础结构主要包含七个部分:

    用户界面:用户所看到的内容和与之交互的功能组件,比如按钮、表单等等
    浏览器引擎:负责控制和管理下一级的渲染引擎
    渲染引擎:解析用户请求的内容并返回
    网络:负责处理网关相关事宜,比如http服务
    UI后端:负责绘制一些提示框等UI组件,底层使用的是操作系统的用户接口
    js解析器:负责解析和执行js代码
    数据存储:负责存储数据如cookie等


    浏览器是多线程的,js是单线程的

    1.GUI渲染线程
    负责渲染浏览器界面,解析HTML,CSS,构建DOM树和RenderObject树,布局和绘制等。
    当界面需要重绘(Repaint)或由于某种操作引发回流(reflow)时,该线程就会执行
    注意,GUI渲染线程与JS引擎线程是互斥的,当JS引擎执行时GUI线程会被挂起(相当于被冻结了),GUI更新会被保存在一个队列中等到JS引擎空闲时立即被执行。

    2.JS引擎线程
    也称为JS内核,负责处理Javascript脚本程序。(例如V8引擎)
    JS引擎线程负责解析Javascript脚本,运行代码。
    JS引擎一直等待着任务队列中任务的到来,然后加以处理,一个Tab页(renderer进程)中无论什么时候都只有一个JS线程在运行JS程序
    同样注意,GUI渲染线程与JS引擎线程是互斥的,所以如果JS执行的时间过长,这样就会造成页面的渲染不连贯,导致页面渲染加载阻塞。

    3.事件触发线程
    归属于浏览器而不是JS引擎,用来控制事件循环(可以理解,JS引擎自己都忙不过来,需要浏览器另开线程协助)
    当JS引擎执行代码块如setTimeOut时(也可来自浏览器内核的其他线程,如鼠标点击、AJAX异步请求等),会将对应任务添加到事件线程中
    当对应的事件符合触发条件被触发时,该线程会把事件添加到待处理队列的队尾,等待JS引擎的处理
    注意,由于JS的单线程关系,所以这些待处理队列中的事件都得排队等待JS引擎处理(当JS引擎空闲时才会去执行)

    4.定时触发器线程
    传说中的setInterval与setTimeout所在线程
    浏览器定时计数器并不是由JavaScript引擎计数的,(因为JavaScript引擎是单线程的, 如果处于阻塞线程状态就会影响记计时的准确)
    因此通过单独线程来计时并触发定时(计时完毕后,添加到事件队列中,等待JS引擎空闲后执行)
    注意,W3C在HTML标准中规定,规定要求setTimeout中低于4ms的时间间隔算为4ms。

    5.异步http请求线程
    在XMLHttpRequest在连接后是通过浏览器新开一个线程请求
    将检测到状态变更时,如果设置有回调函数,异步线程就产生状态变更事件,将这个回调再放入事件队列中。再由JavaScript引擎执行。

  • 相关阅读:
    C/C++操作加密与不加密的zip文件
    vue2源码分析-响应式原理
    Golang实现组合模式和装饰模式
    算法之冒泡排序
    针对海洋数据的管理三维gis软件系统有何优势
    Spring Cloud Alibaba+saas企业架构技术选型+架构全景业务图 + 架构典型部署方案
    【后端检测-绕过】文件头检测绕过、二次渲染绕过
    emq系统调优支持更大并发
    Linux——Linux驱动之iMX6ULL平台下串口UART驱动实现RS232数据通信开发实战(UART驱动框架、源码分析、串口应用程序编写)
    颠覆传统:探索Web3对传统计算机模式的冲击
  • 原文地址:https://blog.csdn.net/weixin_41127362/article/details/126040893