Js中程序执行机制
一、进程和线程
1.进程
当启动某个程序时,操作系统会为其分配内存空间。该内存用来存放代码,存放运行中的数据,存放一个执行任务的总线程。这样的运行环境叫做进程。 例如:xxx.exe 打开的就是一个进程。(浏览器有多个进程,如:渲染进程,GPU进程,插件进程)一个tab标签页就是一个独立的进程
2.线程
进程中的一个执行任务(控制单元)。
2.1 Js中的线程 vs 浏览器中的线程
Js是单线程,同步操作。(单线程是指执行Js代码的线程只有一个,是浏览器提供的Js引擎线程(主线程)) --> 翻译成人话就是一段时间只做一件事情。 而浏览器是多线程的。(浏览器中有其他的线程,定时器线程,HTTP请求线程,这些线程不是用来跑Js代码的)
3.进程与线程的关系
3.1 浏览器何时启动线程?
当Js需要执行异步任务时。浏览器启动另外一个线程来执行该任务。
3.1.1 异步任务
3.2线程与进程工作流程
想摸鱼怎么办? step 1.打开电脑 step 2.打开chrome !!!!操作系统为chrome提供了内存,称为进程 step 3.打开B站。此时浏览器为B站提供了Js引擎主线程。 setp 4.你如何看到更新的视频呢?B站要从远程服务器获取数据,在执行主线程的任务中遇到了AJAX,就把这个请求交给浏览器(HTTP线程)执行。等数据返回了,能看画面了。再将callback里面需要执行的代码交给Js线程
3.2.1 这个过程中是谁发送的网络请求呢?
浏览器。这是浏览器自身的能力
3.2.2 在发送AJAX的过程中,Js线程在干嘛?
Js线程在继续执行代码,不会因为网络请求的时间太长阻塞Js代码的执行。
二、宏任务与微任务
ES6 规范中 ,microtask叫jobs, macrotask叫做task.ES3之前Js引擎不具备发起异步请求的能力,ES5之后,引入了promise之后,Js引擎具备了发送异步请求的能力
1.宏任务 vs 微任务
宏任务特征:有明确的异步任务需要执行和回调,需要其他异步线程支持 微任务特征:无明确的异步任务,只有回调,不需要其他异步线程支持
table | 宏任务 | |
---|---|---|
如何产生 | 宿主(node,浏览器) | Js引擎 |
谁先运行 | 后运行 | 先运行 |
具体事件 | 1. script (可以理解为外层同步代码)2. setTimeout/setInterval3. UI rendering/UI事件4. postMessage,MessageChannel5. setImmediate,I/O(Node.js)5.回调函数 6.事件绑定7.ajax | 1. Promise.then()2. new MutaionObserver3. promise.catch()4.process.nextTick(Node.js) |
是否触发Tick | 会 | 否 |
- 注意:promise 并不是完全同步,在promise是同步,执行resolve或者reject回调的时候,此时是异步操作,会将then/catch等放到微任务队列中,当主栈完成之后,才会调用resolve/reject方法执行
三、事件
1.事件驱动
等我再学学哈
2.事件循环
Js在解析代码的时候,会将同步任务放在执行栈中,然后依次执行里面的函数(方法,每执行一个方法,都会创建一个独有的执行环境,当该方法完成之后,销毁当前执行环境,并从栈中弹出此方法,然后继续下一个方法),当遇到异步任务时,就交给其他线程处理,当同步代码全部执行完毕之后,会从一个任务队列中取出已完成的异步任务的回调加入栈继续执行. 在事件驱动的模式下。至少包含了一个执行循环来检测任务队列是否有新任务。通过不断循环去取出异步回调来执行,这个过程就是事件循环,一次循环就是一个事件周期或称为一次Tick
2.1 js如何解决任务队列中的程序执行问题
执行栈中的任务完成后,会优先检查微任务队列中,接着是宏任务队列
2.2 如何处理微任务队列
例如: 处理promise.then()时,V8引擎不会将异步任务交给其他线程处理,而是直接将回调放在任务队列中,也就是说,promise.then()微任务没有其他线程的参与
2.3.定时器误差
我们都知道,Js执行顺序是同步代码 --> 微任务队列 --> 宏任务队列 。假设我现在有一个定时器,预计在3秒后打印数值。好! 我们现在开始跑代码 -.........- 同步代码执行过程中 遇到了 异步任务 ,交给浏览器的其他线程去处理异步任务, 并将异步回调放入队列中,那么此时问题来了 假设此时同步代码还没有执行完呢?那么这个3s就显得不准确了,这个宏任务队列只能挂起,计时器不准确。同理,微任务队列也会影响计时器的准确性。所以主线程的执行效率是一个非常重要的关键点
转载自:https://juejin.cn/post/7367569647351906331