渲染进程中的各线程

1,545 阅读2分钟

浏览器至少有四个进程:

  • 浏览器主进程
  • GPU进程
  • 网络进程
  • 渲染进程

其中渲染进程又有五个线程:

  • 主线程(js引擎线程)

  • GUI渲染线程

  • 事件触发线程

  • 定时器触发线程

  • http请求线程

一、主线程

主线程主要用于处理js代码(解析、执行)。只要消息队列不为空,就会一直从中取任务执行。由于主线程和GUI线程的互斥,所以当一个js任务执行过长时,会阻塞页面的渲染,造成页面的卡顿。

二、GUI渲染线程

GUI渲染线程负责解析HTML、CSS、合成CSSOM树、布局树、绘制、分层、栅格化、合成,所以重绘、重排、合成都在改线程中执行。

GUI线程和JS引擎线程是冲突的,当GUI线程执行时,js引擎线程会被挂起,当js引擎线程执行任务时,有需要GUI线程执行的任务,会被保存到一个队列中,等待js引擎执行完执行。

三、事件触发线程

当js代码在解析时,遇到事件比如鼠标事件时,会将这些任务添加到事件触发线程中,等事件触发时,会将任务从事件触发线程中取出,放到消息队列的队尾等待执行。

四、定时器触发线程

用于存放setTimeout、setInterval等任务,在解析遇到这些任务时,js引擎会将这些任务放到定时器触发线程中,并开始计数,时间到了之后,将任务放到消息队列中等待执行。

五、http请求线程

用于检测XMLHttpRequest请求,当请求状态改变时,将设置的回调函数添加到消息队列中等待执行。