事件循环

44 阅读3分钟

进程与线程

进程

每一个应用/浏览器页面单独开辟的内存空间,彼此之间互不影响,但可以彼此通信;

线程

线程属于进程,负责执行进程中的代码;每一个进程至少有一个线程,为主线程;一个进程可以包括多个线程,进程通过多线程同时执行多段代码;

浏览器的操作系统化

浏览器功能繁多,内部包括多个进程,类似操作系统,比如主进程,负责浏览器平台页面显示、用户交互、子进程管理;网络进程,负责网络通信;渲染进程,负责渲染具体的标签页;

渲染进程

渲染进程的主线程负责任务包括:解析HTML、解析CSS、计算样式(单位换算、优先级计算)、布局、处理图层(z-index)、逐帧绘制页面、执行全局JS代码、 执行事件处理函数、执行计时器回调函数...

渲染主线程的任务调度--事件循环(消息循环)

渲染主线程有两个状态:休眠与循环状态,当消息(任务)队列有待执行任务,渲染主线程为循环状态,优先执行正在执行的任务,任务执行完毕,循环执行消息(任务)队列中的消息,直到消息(任务)队列为空,最先进入消息(任务)队列的任务最先执行;当消息队列为空,渲染主线程进入休眠状态,直到消息队列重新进入任务,渲染主线程才会被唤醒; image.png

JS的异步理解

js是单线程语言,对于很多不是立即执行的代码,如果同步执行,那么就会阻塞后续其他代码的执行,直到当前代码执行时机到来并且执行完毕才会继续执行后续代码,js依赖宿主环境的事件循环模型可以实现js代码异步执行,将定时器、事件监听、网络请求等需要长时间等待的代码交给宿主环境的其他线程来处理,虽然js只有一个线程,但是js如果运行在浏览器中,浏览器的渲染进程的主线程负责执行js代码,渲染进程的其他线程可以来处理异步js代码,等待异步js代码的执行时机到来,其他线程将要执行的js代码推送到消息队列,等待渲染进程主线程依次执行。当然js不仅能运行在浏览器中,还能运行在node环境中,node同样也有事件循环,与浏览器事件循环大同小异。

异步任务的优先级

随着浏览器的复杂度急剧提升,W3C不再使用宏队列的说法,在目前的chrome的实现中,至少包含了下面的队列:

1.延时队列:存放计时器到达后的回调任务,优先级中等

2.交互队列:存放用户操作后产生的事件处理任务,优先级高

3.微队列:存放需要最快执行的任务,优先级最高