js为什么是单线程的

599 阅读3分钟

一、进程与线程的区别

  • 进程:狭义上,就是正在运行的程序的实例。广义上,进程是一个具有一定独立功能的程序关于某个数据集合的一次运行活动。它是操作系统动态执行的基本单元,在传统的操作系统中,进程既是基本的分配单元,也是基本的执行单元。例如:电脑打开的任务管理器里面可以看到一个个进程。进程是cpu资源分配的最小单位
  • 线程线程是cpu调度的最小单位(线程是建立在进程的基础上的一次程序运行单位,一个进程中可以有多个线程

二、js是单线程的

注意

  • 1.现在,一般通用的叫法:单线程与多线程,都是指在一个进程内的单和多。(所以核心还是得属于一个进程才行)
  • 2.不同进程之间也可以通信,不过代价较大
2.1 为什么js是单线程的(个人理解)

JavaScript® (通常简写为JS)是一种轻量的、解释性的、面向对象的头等函数语言,为了避免渲染dom元素的冲突(例如如果多段代码渲染Dom,前者在增加dom,后者在删除dom,可能会发生冲突,)我们可以为浏览器引入 的机制来解决这些冲突,但基于设计之初就定义为轻量级的语言,这无疑大大提高了复杂性,所以 JavaScript从诞生开始就选择了单线程执行

三。浏览器是多进程的

  • 浏览器之所以能够运行,是因为系统给它的进程分配了资源(cpu、内存)
  • 简单点理解,每打开一个Tab页,就相当于创建了一个独立的浏览器进程 注意: 在这里浏览器应该也有自己的优化机制,有时候打开多个tab页后,可以在Chrome任务管理器中看到,有些进程被合并了 (所以每一个Tab标签对应一个进程并不一定是绝对的)
3.1 浏览器都包含哪些主要进程

注:通过浏览器 设置->更多工具->任务管理器 里面可以查看到具体的进程内容

  • Browser进程:浏览器的主进程(负责协调、主控),只有一个。作用有
    • 负责浏览器界面显示,与用户交互。如前进,后退等
    • 负责各个页面的管理,创建和销毁其他进程
    • 将Renderer进程得到的内存中的Bitmap,绘制到用户界面上
    • 网络资源的管理,下载等
  • 第三方插件进程:每种类型的插件对应一个进程,仅当使用该插件时才创建
  • GPU进程:最多一个,用于3D绘制等
  • 浏览器渲染进程(浏览器内核)(Renderer进程,内部是多线程的):默认每个Tab页面一个进程,互不影响。主要作用为
    • 页面渲染,脚本执行,事件处理等
浏览器多进程的优势

相比于单进程浏览器,多进程有如下优点:

  • 避免单个page crash影响整个浏览器
  • 避免第三方插件crash影响整个浏览器
  • 多进程充分利用多核优势
  • 方便使用沙盒模型隔离插件等进程,提高浏览器稳定性 简单点理解:如果浏览器是单进程,那么某个Tab页崩溃了,就影响了整个浏览器,体验有多差;同理如果是单进程,插件崩溃了也会影响整个浏览器;而且多进程还有其它的诸多优势。。。 当然,内存等资源消耗也会更大,有点空间换时间的意思