Event Loop
Event Loop是在JS单线程的情况下通过任务队列管理程序执行顺序的方式。由任务源不同,任务队列也可以分为微任务与宏任务。微任务一般有:promise;宏任务有:script
,setTimeout
,setInterval
,setTmmediate
,I/O
,UI rendering
。在Event Loop下程序的执行顺序是…。
同步代码的执行顺序是通过执行栈来确定的:…执行栈
面试题目:进程与线程的区别?JS单线程带来的好处
进程:CPU在运行指令及加载和保存上下文所需的时间
线程:进程中的更小单位,描述了执行一段指令所需的时间
JS在运行时可能会阻止UI渲染,说明这两个线程是互斥的。
原因:JS可以修改DOM,如果在执行JS的时候UI线程还在工作,就可能导致不能安全的渲染UI。
这其实也是单线程的好处,得益于JS是单线程运行的,可以达到节省内存,节约上下文切换时间,没有锁的问题。
这些好处是如何体现的?
节省内存:???
节约上下文切换时间:JS是单线程,通过任务队列的方式排列程序的执行顺序,只有一个线程,不用来回切换。而多线程异步的时候执行代码需要跳转到其他线程去,跳转之前需要保存原有线程的执行状态,以便回来的时候能继续执行
没有锁:
锁:当读取一个数字15时,同时有两个操作对数字进行了加减,这时候就过就出现了错误。解决:只需在读取的时候枷锁,知道读取完毕之间都不能进行写入操作
线程与进程的区别
1、进程是资源分配的最小单位,线程是程序执行的最小单位(资源调度的最小单位)
2、进程有自己的独立地址空间,每启动一个进程,系统就会为它分配地址空间,建立数据表来维护代码段、堆栈段和数据段,这种操作非常昂贵。
而线程是共享进程中的数据的,使用相同的地址空间,因此CPU切换一个线程的花费远比进程要小很多,同时创建一个线程的开销也比进程要小很多。
3、线程之间的通信更方便,同一进程下的线程共享全局变量、静态变量等数据,而进程之间的通信需要以通信的方式(IPC)进行。不过如何处理好同步与互斥是编写多线程程序的难点。
4、但是多进程程序更健壮,多线程程序只要有一个线程死掉,整个进程也死掉了,而一个进程死掉并不会对另外一个进程造成影响,因为进程有自己独立的地址空间。
作者:小雨启明
链接:https://www.jianshu.com/p/2dc01727be45
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
执行栈
可以把执行栈认为是一个存储函数调用的栈结构,遵循先进后出的原则。[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
当我们使用递归的时候,因为栈可存放的函数是有限制的,一旦存放了过多的函数切没有得到释放,就会出现爆栈的问题
浏览器的Event Loop
面试题目:异步代码执行顺序?解释一下什么是Event Loop
遇到异步代码时,会被挂起并在需要执行的时候加入到Task队列中。一旦执行栈为空,Event Loop就会从Task队列中拿出需要执行的代码并放入执行栈中执行,所以本质上JS中的异步还是同步行为。
不同的任务源会被分配到不同的Task队列中,任务源可以分为微任务(microtask)和宏任务(macrotask)。在ES6规范中,microtask被称为jobs
,macrotask被称为task
Event Loop执行顺序如下
- 首先执行同步代码,这属于宏任务
- 当执行完所有同步代码后,执行栈为空,查询是否有异步代码需要执行
- 执行所有微任务
- 当执行完所有微任务后,如有必要会渲染页面
- 然后开始下一轮Event Loop,执行宏任务中的异步代码,也就是setTimeout中的回调函数
微任务包括:process.nextTick
,promise
,MutationObserver
宏任务包括:script
,setTimeout
,setInterval
,setTmmediate
,I/O
,UI rendering
Node中的Event Loop
面试:Node中的Event Loop和浏览器中的有什么区别?process.nextTick执行顺序?
node没学,暂时不考虑
关键词:6阶段、顺序循环执行
Node 的 Event Loop 分为 6 个阶段,它们会按照顺序反复运行。每当进入某一个阶段的时候,都会从对应的回调队列中取出函数去执行。当队列为空或者执行的回调函数数量到达系统设定的阈值,就会进入下一阶段。
Node 的 Event Loop 分为 6 个阶段,它们会按照顺序反复运行。每当进入某一个阶段的时候,都会从对应的回调队列中取出函数去执行。当队列为空或者执行的回调函数数量到达系统设定的阈值,就会进入下一阶段。