# 前言

陆陆续续看过很多浏览器的进程线程资料,此处仅为翻看资料的随手笔记,不做具体描述

# 浏览器是多进程的

  • 主进程

    管理协调各个页面,创建/销毁各个页面进程,网络资源的管理、下载等

  • 插件进程
  • GPU进程
  • 渲染进程

    每个tab都有自己独立的进程

# 渲染进程

  • GUI渲染线程
  • JS引擎线程
  • 事件触发线程

    即 event loop 线程

  • 定时触发器线程

    setTimeout, setInterval 规范中规定延时小于4ms,也会当成4ms处理

  • http请求线程

    常规的都是单域名限制最大6个,所有域名最大数量暂未了解到 可以分散到多个域名,http2.0的多路复用也能变相解决该问题

# JS线程与GUI线程互斥

防止渲染前后DOM数据不一致,耗时的作需要使用web worker

通过postMessage 通信

# 浏览器渲染基本过程

  • 解析html生成dom树
  • 解析css构建render树(csss树结合dom树合并成render树)
  • 布局render树(layout/reflow),计算尺寸、位置
  • 绘制render树,绘制页面像素
  • 发送到GPU,交由GPU显示

# 硬件加速

渲染图层分为两种:普通图层、复合图层

Chrome源码调试 -> More Tools -> Rendering -> Layer borders,黄色的边框为复合图层

硬件加速即指复合图层

translate3d、translateZ、opacity、will-chang、<video />、<iframe />、<canvas />、<webgl />

复合图层独立于普通文档流中,修改后不会影响普通文档流

尽可能使复合图层层级高,浏览器默认会将高于复合图层的文档变为复合图层 大量使用导致资源消耗过度,页面反而会更卡

# event loop

  • JS引擎线程
  • 事件触发线程
  • 定时触发器线程

事件触发器维护着一个任务队列,当JS引擎空闲时就会来取任务执行 定时器触发后就会往事件触发器中推入任务

# macrotask与microtask

优先级:microtask>macrotask

microtask: Promise、process.nextTick macrotask: 主代码、setTimeout、setInterval

参考资料: https://jakearchibald.com/2015/tasks-microtasks-queues-and-schedules/ https://segmentfault.com/a/1190000012925872