Event Loop、宏任务、微任务到底什么关系?

CPU、进程、线程

CPU、进程、线程之间的关系

cpu:计算机的核心,承担了所有的计算任务;

进程: 进程就好比工厂的车间,它代表CPU所能处理的单个任务,CPU使用时间片轮转进度算法来实现同时运行多个进程;

线程: 线程就好比车间里的工人,一个进程可以包括多个线程,多个线程共享进程资源;

浏览器是多进程的,其中包含了主进程、第三方插件进程、GPU进程、渲染进程,其中有渲染进程,也就是我们说的浏览器内核;

浏览器内核又包含多条线程

GUI渲染线程:

  • 负责渲染页面,布局和绘制
  • 页面需要重绘和回流时,该线程就会执行
  • 与js引擎线程互斥,防止渲染结果不可预期

JS引擎线程:

  • 负责处理解析和执行javascript脚本程序
  • 只有一个JS引擎线程(单线程)
  • 与GUI渲染线程互斥,防止渲染结果不可预期

事件触发线程:

  • 用来控制事件循环(鼠标点击、setTimeout、ajax等)
  • 当事件满足触发条件时,将事件放入到JS引擎所在的执行队列中

定时触发器线程:

  • setInterval与setTimeout所在的线程
  • 定时任务并不是由JS引擎计时的,是由定时触发线程来计时的
  • 计时完毕后,通知事件触发线程

异步http请求线程:

  • 浏览器有一个单独的线程用于处理AJAX请求
  • 当请求完成时,若有回调函数,通知事件触发线程

同步与异步

javascript是单线程的,但是浏览器并不是单线程的;例如我们使用了setTimeout,在浏览器中就会有一个定时触发器线程去为我们执行代码;也就是说这些内部的API会用单独的线程去执行;

同步还是异步指的是 运行环境提供的API是以同步或异步模式的方式去工作;

js中的任务分为同步任务和异步任务

同步模式:

同步任务都在JS引擎线程上执行,形成一个执行栈

代码当中的任务依次执行,执行顺序与代码的编写顺序完全一致,在单线程的情况下,大多数任务都会以同步模式的方式去执行;但是如果其中有个任务执行的时间过长,就会产生阻塞,意味着页面会卡顿或者无法操作,所以需要有异步模式,来解决程序中无法避免的耗时操作;

console.log(1)

function b() {
   
    console.log(3)
}

function a() {
   
    console.log(2)
    b()
}
a()
console.log(4)

异步模式:

事件触发线程管理一个任务队列,异步任务触发条件达成,将回调事件放到任务队列中;

不会去等待这个任务的结束才开始下一个任务,开启过后就立即往后执行下一个任务,后续逻辑一般会通过回调函数的方式来定义;

console.log(1)
setTimeout(function time1() {
   
    console.log(4)
}, 1800)
setTimeout(function time2() {
   
    console.log(3)
    setTimeout(function inner () {
   
        console.log(5)
    }, 1000)
}, 1000)
console.log(
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Whoopsina

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值