• JavaScript单线程模型


    JavaScript语言的一大特点就是单线程,也就是说,同一时间只能做一件事,前面的任务没做完,后面的任务只能等着。

    1. 为什么JavaScript是单线程的呢?

    • 这主要与JavaScript用途有关。它的主要用途是与用户互动,以及操作DOM。如果JavaScript是多线程的,会带来很多复杂的问题,假如 JavaScript有A和B两个线程,A线程在DOM节点上添加了内容,B线程删除了这个节点,应该是哪个为准呢? 所以,为了避免复杂性,所以设计成了单线程。
    • 虽然 HTML5 提出了Web Worker标准。Web Worker 的作用,就是为 JavaScript 创造多线程环境,允许主线程创建 Worker 线程,将一些任务分配给后者运行。但是子线程完全受主线程控制,且不得操作DOM。所以这个并没有改变JavaScript单线程的本质。一般使用 Web Worker 的场景是代码中有很多计算密集型或高延迟的任务,可以考虑分配给 Worker 线程。
    • 但是使用的时候一定要注意,worker 线程是为了让你的程序跑的更快,但是如果 worker 线程和主线程之间通信的时间大于了你不使用worker线程的时间,结果就得不偿失了。

    2. 浏览器内核中线程之间的关系

    • GUI渲染线程和JS引擎线程互斥
      • js是可以操作DOM的,如果在修改这些元素的同时渲染页面(js线程和ui线程同时运行),那么渲染线程前后获得的元素数据可能就不一致了。
    • JS阻塞页面加载
      • js如果执行时间过长就会阻塞页面

    3. 浏览器是多进程的优点

    • 默认新开 一个 tab 页面 新建 一个进程,所以单个 tab 页面崩溃不会影响到整个浏览器。
    • 第三方插件崩溃也不会影响到整个浏览器。
    • 多进程可以充分利用现代 CPU 多核的优势。
    • 方便使用沙盒模型隔离插件等进程,提高浏览器的稳定性。

    4. 进程和线程又是什么呢

    进程(process)和线程(thread)是操作系统的基本概念。

    • 进程是 CPU 资源分配的最小单位(是能拥有资源和独立运行的最小单位)。
    • 线程是 CPU 调度的最小单位(是建立在进程基础上的一次程序运行单位)。

    由于每个进程至少要做一件事,所以一个进程至少有一个线程。系统会给每个进程分配独立的内存,因此进程有它独立的资源。同一进程内的各个线程之间共享该进程的内存空间(包括代码段,数据集,堆等)。

    进程可以理解为一个工厂不不同车间,相互独立。线程是车间里的工人,可以自己做自己的事情,也可以相互配合做同一件事情。

    5. 任务队列

    • 单线程就意味着,所有任务都要排队执行,前一个任务结束,才会执行后一个任务。
    • 如果一个任务需要执行,但此时JavaScript引擎正在执行其他任务,那么这个任务就需要放到一个队列中进行等待。等到线程空闲时,就可以从这个队列中取出最早加入的任务进行执行(类似于我们去银行排队办理业务,单线程相当于说这家银行只有一个服务窗口,一次只能为一个人服务,后面到的就需要排队,而任务队列就是排队区,先到的就优先服务)

    注意: 如果当前线程空闲,并且队列为空,那每次加入队列的函数将立即执行。

    为什么会有任务队列? 由于 JS 是单线程的,同步执行任务会造成浏览器的阻塞,所以我们将 JS 分成一个又一个的任务,通过不停的循环来执行事件队列中的任务。

  • 相关阅读:
    ARCGIS网络分析
    python绘制动图,保存gif:(matplotlib.animation.FuncAnimation)
    【软件逆向-自动化】逆向工具大全
    JWT安全
    说一下 JVM 有哪些垃圾回收器?
    插入算法改进-排序-数据结构与算法
    Intel汇编-内联汇编使用处理跳转
    YOLO系列 --- YOLOV7算法(三):YOLO V7算法train.py代码解析
    Astro建站教程:安装nodejs,npm下载Astro,安装扩展
    怎么选工作流表单设计器?
  • 原文地址:https://blog.csdn.net/php_martin/article/details/125869090