Event Loop

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执行顺序如下

  1. 首先执行同步代码,这属于宏任务
  2. 当执行完所有同步代码后,执行栈为空,查询是否有异步代码需要执行
  3. 执行所有微任务
  4. 当执行完所有微任务后,如有必要会渲染页面
  5. 然后开始下一轮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 个阶段,它们会按照顺序反复运行。每当进入某一个阶段的时候,都会从对应的回调队列中取出函数去执行。当队列为空或者执行的回调函数数量到达系统设定的阈值,就会进入下一阶段。

在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值