blog
blog copied to clipboard
剖析JavaScript运行机制
Table of Contents generated with DocToc
-
先了解进程和线程
- 进程
- 线程
- 进程和线程
- 多进程和多线程
- JavaScript是单线程的
-
浏览器中的进程和线程
- 浏览器是多进程的
- 浏览器中进程的分类
- 浏览器需要多进程
-
单独阐述渲染进程Renderer(重点)
- GUI渲染线程
- JS引擎线程
- 事件触发线程
- 定时触发器线程
- 异步HTTP请求线程
- 事件循环(Event Loop)
- 宏任务和微任务
JavaScript在浏览器环境中的运行机制,无论是平时的开发,或者面试,都会经常用到,所以有必要精炼的总结一下这方面的知识点
先了解进程和线程
进程
进程就是CPU
资源分配的最小单位,它包含了运行中的程序和该程序所使用到的内存及系统资源。
CPU
可以开启多个进程,每个进程之间是相互独立的,CPU
在运行一个进程时,其他进程处于非运行状态,CPU
利用时间片轮转调度算法来实现同时运行多个进程.
时间片轮转调度是一种最古老,最简单,最公平且使用最广的算法。每个进程被分配一个时间段,称作它的时间片,即该进程允许运行的时间。如果在时间片结束时进程还在运行,则
CPU
将被剥夺并分配给另一个进程。如果进程在时间片结束前阻塞或结束,则CPU
当即进行切换。调度程序所要做的就是维护一张就绪进程列表,当进程用完它的时间片后,它被移到队列的末尾。(摘自百度百科)
线程
线程是CPU
调度的最小单位,它建立在进程的基础上,是程序的一个执行流,一个进程可以有一个或多个线程(单线程和多线程)
进程和线程
-
进程是操作系统分配资源的最小单位,而线程是程序执行的最小单位
-
一个进程可以由一个或多个线程组成
-
进程之间相互独立,而同一进程中的各个线程可以共享内存空间
-
线程的上下文切换比进程快很多
多进程和多线程
多进程指计算机中同时运行多个程序,而多线程指一个进程中包含多个执行流,即在一个进程中通过多个线程来执行不同的任务。
JavaScript是单线程的
JavaScript
最初的设计就是用来处理用户行为,及其对DOM
的操作,所以它只能是单线程,否则会带来复杂的同步问题,比如一个DOM
如果被多个线程同时操作,执行结果将会如何呢?
HTML5
提出了Web Worker
,Worker
线程受主线程控制,且不能操作DOM
,只是用来处理一些额外的计算操作,所以它从本质上没有改变JavaScript
单线程的特征
浏览器中的进程和线程
浏览器是多进程的
浏览器是多进程的,每打开一个Tab
页,就创建了一个独立的进程,且它们之间不会相互影响
浏览器中进程的分类
-
Browser
进程:浏览器的主进程,该进程只有一个,负责协调、主控 -
渲染进程(重点):该进程即浏览器内核(
Renderer
进程),其内部是多线程的。每个Tab
都会有一个渲染进程,互不影响,它主要负责页面渲染、脚本执行和事件处理等。 -
GPU
进程:该进程只有一个,用于绘制 -
第三方插件进程:每种类型的插件都会有一个进程,只有当启用该插件时才会创建该进程
浏览器需要多进程
从上述看出,浏览器有多个不同类型的进程,浏览器是需要多进程的,否则多个Tab
中如果有一个崩溃,就会影响整个浏览器。
其他诸如插件进程也是一样,不能影响其他进程的工作
单独阐述渲染进程Renderer(重点)
页面渲染、事件循环、JavaScript
代码执行等都是在渲染进程内执行的,它是多线程的,每种线程执行不同的任务
GUI渲染线程
-
该线程负责渲染浏览器页面,解析
HTML
、CSS
,构建DOM
树和RenderObject
树,布局和绘制等。- 它负责解析
HTML
代码,将其转化为DOM
节点,生成DOM
树(DOM Tree
) - 解析
CSS
,生成CSSOM
(CSS
规则树) - 把
DOM Tree
和CSSOM
结合,生成Rendering Tree
(渲染树)
- 它负责解析
JS引擎线程
事件触发线程
定时触发器线程
异步HTTP请求线程
事件循环(Event Loop)
宏任务和微任务
(https://juejin.im/post/5e22b391f265da3e204d8c14#heading-12)