为什么js是单线程
初学计算机语言的时候,无论是 C、C++
还是 JAVA
,都是支持多线程,偏偏 JavaScript
是单线程,不支持多线程,这也跟 JavaScript
的作用有关,都知道 JavaScript
是主要运行在浏览器的脚本语言,最终操作的是页面的 DOM
结构,当两个 JavaScript
脚本同时修改页面的同一个 DOM
节点时,浏览器该执行哪个呢?所以当时设计 JavaScript
时,便要求当前修改操作完成后方可进行下一步修改操作。
浏览器是支持多进程
浏览器的每一个 tab
页都是一个进程,有对应的内存占用空间、 CPU
使用量以及进程ID。 新打开一个 tab
页时,都会新建一个进程,所以就有一个 tab
页对应一个进程的说法,但是这种说法又是错误的,因为浏览器有自己的优化机制,当我们打开多个空白的 tab
页时,浏览器会将这多个空白页的进程合并为一个,从而减少了进程的数量个数。
浏览器内核
浏览器内核中有多个进程在同步工作,今天涉及到的浏览器的进程主要包括以下进程:
- Browser 进程
- Render 进程
Browser 进程
主进程,主要负责页面管理以及管理其他进程的创建和销毁等,常驻的线程有:
- GUI渲染线程
- JS引擎线程
- 事件触发线程
- 定时器触发线程
- HTTP请求线程
GUI渲染线程
- 主要负责页面的渲染,解析HTML、CSS,构建DOM树,布局和绘制等。
- 当界面需要重绘或者由于某种操作引发回流时,将执行该线程。
- 该线程与JS引擎线程互斥,当执行JS引擎线程时,GUI渲染会被挂起,当任务队列空闲时,JS引擎才会去执行GUI渲染。