从浏览器多进程到js单线程

Posted by WWJ on July 9, 2018

从浏览器多进程到JS单线程

浏览器多进程

每打开一个tab标签就会开启一个独立的进程

浏览器都包含了哪些进程

  1. Browser进程:浏览器的主进程,只有一个,作用有
    • 负责浏览器界面显示,与用户交互。比如前进、后退
    • 负责各个页面的管理,创建和销毁其它进程
    • 负责与渲染进程交流
    • 网络资源的管理,下载等
  2. 第三方插件进程:
  3. GPU进程:
  4. 浏览器渲染进程:
    • 页面的渲染和绘制,脚步执行,事件处理等

      浏览器多进程的优势

    • 避免关闭单个页面影响整个浏览器
    • 避免第三方插件影响整个浏览器

      渲染进程

  5. GUI渲染线程
    • 负责渲染浏览器页面,解析HTML,CSS,构建DOM树和RENDER树,布局和绘制
    • 当界面需要重绘或者由于回流时,该线程会执行
    • GUI线程和JS线程是互斥的
  6. JS线程
    • 解析执行JS脚本
    • 当JS线程上没有任务时,就去执行任务队列中的事件
  7. 事件触发线程
  8. 定时器线程
    • setTimeout:定时器,到达指定时间间隔后把回调函数推入事件任务队列,并等待JS引擎执行
    • setInterval:计数器,每次都精确的按照指定的时间间隔把回调函数推人事件任务队列,并等待JS引擎执行
    • 一般用递归+setTimeout模拟setInterval,因为setInterval的事件执行时间不一定执行准确,可能下一个事件开始执行了,上一个任务还没有结束
  9. 异步HTTP请求线程

    浏览器内核中线程之间的关系

  10. GUI线程和JS线程互斥
  11. JS阻塞页面加载

    从Event Loop谈JS运行机制

  12. 同步任务:在JS主线程上形成一个执行栈
  13. 异步任务:调用事件触发线程,只要异步任务有了结果,就将任务推入事件任务队列
  14. 总是要的等到执行栈空了以后才会去执行事件任务队列里的任务