浏览器原理:6.1消息队列和事件循环

消息队列和事件循环是浏览器调度安排各个任务的两大机制,此时可以把浏览器看做一个OS,它需要来调度各个任务,包括确定任务优先级,分配任务的占用资源,以及负责提供与操作系统的接口等等。

为什么需要消息队列和事件循环?

简单来说,因为之前的机制无法满足需求,让我们从OS发展历史的角度来看浏览器中的消息队列和事件循环的必要性。在计算机刚出现的年代,还没有操作系统这一概念,所有的程序都是一个一个靠人工来输入进去,一个一个按顺序执行,不能随意更改顺序,并且一旦出错,一切就都要重头再来,这样极大地降低了计算机的使用性能,于是便提出了操作系统这一概念

准确来说应该是批处理系统(batch system),批处理系统最大的优点就是在程序和CPU之间提供一个monitor,它专门用来调度程序。批处理系统也是一个程序,当批处理系统在调度各个程序的时候,此时CPU的控制权在批处理系统上,当调度完成后,控制权转移到了要运行的那个应用程序上,当那个应用程序运行完成后,CPU的控制权又会转移到批处理系统上。到浏览器身上也是一样,浏览器不可能让用户来控制程序的输入,也不可能让程序员时刻都守着来调度各个程序,所以浏览器需要这么一套自动调度各个程序的机制。消息队列和事件循环就是对这套机制的一个实现。

消息队列和事件循环的具体流程

我们以渲染进程中的渲染主线程来详细介绍消息队列和事件循环机制,因为渲染主线程负责用户所看到的页面的渲染,与其他线程、进程通信比较频繁。

因为随意的一个操作,例如用户的点击(I/O线程),资源加载完成(网络进程)等等其他事件,都会引起浏览器的页面改变,触发渲染,所以渲染主线程需要时时刻刻来捕捉这些事件,不能懈怠。事件循环就是针对这一情况来实现的,其本质就是取出事件,执行事件触发的任务,然后不断循环。可以类比CPU的工作,取指令 + 执行指令。但是这样往往会有一个问题,就是如果一次性触发了多个事件并且这些事件都来自不同的线程,该怎样来确定这些事件的优先级。消息队列就是来解决这一情况的,以队列先进先出的特点。但需要注意的是,由于是多个线程来操作同一个消息队列,需要考虑同步的问题,所以需要加锁。

但消息队列这一先进先出的特点,无法满足优先级这一需求,于是微任务应运而生。通常把消息队列中的任务称为宏任务,每个宏任务又包含了一个微任务队列,当宏任务执行完成后,会先把该宏任务的微任务队列执行完成后,再去执行下一个宏任务。这样就满足了优先级这一特点,通过再细化时间颗粒。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值