一 概念
1.进程类似于工厂,有自己独立的资源(内存)。
2. 线程类似于工厂中的工人,多个工人之间协同合作,共享内存。
3. event loop:事件循环 stack:栈 heap:堆 callback queue:回调队列(事件队列)
4. 浏览器包括的进程有:主进程,GPU进程(3D绘制),插件进程,渲染进程。
5. 浏览器的渲染进程,也就是浏览器的内核,负责页面渲染,脚本执行,事件处理等等,其内部是多线程的。包括GUI渲染线程,js引擎线程,事件触发线程,定时器触发线程,异步http请求线程等等。
6.渲染进程中各线程的作用:GUI线程负责渲染页面,解析html,css,构建dom树,布局和绘制页面;js引擎线程也是主线程,负责执行js脚本;事件触发线程归属于浏览器线程,负责事件监听等事件执行(可以理解为事件队列);定时器线程也就是setInterval和setTimeout所在的线程;异步http请求线程负责XMLHttpRequest请求;其中渲染线程和js引擎线程是互斥的,也就是说这两个线程不能同时执行,这也解释了为什么过长的js脚本执行会阻塞页面的渲染。
二 js运行原理(解释为什么js是单线程,还可以异步执行任务)
js代码会在js引擎的执行栈中以单线程的方式执行。而所有I/O或者定时任务等等异步代码会通过运行环境(浏览器)中的其他线程异步执行,并将回调函数(执行结果)放在回调队列(callback queue)中等待被调用。当执行栈中没有可执行代码时,通过事件循环(event loop)检查并取出事件队列中的第一个事件执行。