浏览器核心线程分析

216 阅读3分钟

浏览器核心线程

浏览器在渲染网页是一个复杂的过程, 整个过程由多个独立线程协作

  • GUI渲染线程
  • JS引擎线程
  • 事件触发线程
  • 定时触发器线程
  • 异步HTTP请求线程

核心线程

线程能力

GUI渲染线程

  • 作用:负责渲染浏览器界面,包括解析、构建、布局、绘制等功能,并最终将数据展示到屏幕

  • 特点:

    • 执行在主线程
    • GUI渲染线程受JS引擎线程执行影响,当JS引擎线程执行时,会将GUI渲染线程挂起,等待JS引擎执行完成会重新激活(因为JS执行可能会修改dom,影响渲染流程)。
    • 当页面发生重排(reflow)、重绘(repaint)时,会唤起GUI渲染线程。
  • 补充:浏览器渲染流程的几个重要流程皆由GUI渲染线程负责

JS引擎线程

  • 作用:解析和执行JS代码,调用各类API(DOM API、Navigator API等)操作页面

  • 工作机制:实时监听JS任务队列,对任务分类、调度和执行

  • 特点:

    • 执行在主线程
    • 一旦JS引擎开始执行任务,GUI渲染线程将被挂起,直到任务执行完成

事件触发线程

  • 作用:监听用户交互行为,如鼠标点击、键盘输入、用户触摸等行为

  • 工作机制:与IO外设接口打交道,监听到用户交互行为则向任务队列中添加任务

  • 特点:

    • 执行在辅助线程,最终任务交由主线程执行(一般是JS引擎线程)

定时触发器线程

  • 作用:处理定时器(如setTimeout、setInterval)行为

  • 工作机制:作为计时器,计时完成则向任务队列中添加任务

  • 特点:

    • 执行在辅助线程,最终任务交由主线程执行(一般是JS引擎线程)
    • HTML5规范要求小于4ms的定时默认为4ms(delay < 4ms ? 4ms : delay)

异步HTTP请求线程

  • 作用:处理异步请求(XMLHttpRequest、fetch)行为

  • 工作机制:

    • 由主线程任务(GUI渲染、JS执行时)唤起
    • 客户端与服务端连接、通信和断开
    • 按照参数组装请求包、读取响应包并做初步处理(错误响应状态拦截、缓存保存和读取 等)
    • 响应数据处理完成后将向任务队列中添加任务
  • 特点:

    • 执行在辅助线程,最终任务交由主线程执行(一般是JS引擎线程)

总结

  • GUI渲染线程和JS引擎线程执行在主线程,GUI渲染线程受JS引擎影响(JS执行时间过长影响页面渲染)

  • 事件触发线程、定时触发器线程、异步HTTP请求线程作为辅助线程,它们相对独立,负责各自任务,执行完成任务后都将结果通过任务形式添加到任务队列

    • 可以把主线程理解为一个组装厂,辅助线程理解为供应不同物料的供应商,这些供应商互相独立。组装厂开始运行时会拟一个组装手册,记录如何组装,需要哪些物料,其中如何组装是组装厂需要处理的事,而物料则通知各个供应商,各供应商开始生产,生产完成后运到组装厂,组装厂在不同组装步骤使用到不同物料,最终生产出一个完整的物品

线程调度