浏览器的多进程架构简介

浏览器的进程包括:

  • Browser进程(主进程)浏览器

    • 前进后退
    • 页面管理建立销毁其余进程
    • 网络资源的管理下载
    • 将render进程获得的内存中的bitMap,绘制到用户界面
  • 浏览器渲染进程网络

    • 默认每一个Tab页面一个进程,互不影响
    • 用于渲染页面、执行脚本、事件处理
    • 浏览器渲染进程包括
    • GUI渲染线程
    • 负责渲染浏览器界面,解析HTML、CSS、构建DOM树和渲染树,布局和绘制
    • 界面重排重绘
    • GUI渲染线程与JS线程互斥,当JS引擎线程执行时,GUI线程被挂起,GUI的更新会保存在一个队列中等JS引擎线程空闲时间当即被执行。
    • 为何GUI与JS引擎线程互斥
    • JS能够操做DOM若是在修改元素同时渲染界面(即JS线程和GUI线程同时进行),渲染线程先后得到的数据极可能不一致
  • JS引擎线程多线程

    • 负责处理JS脚本(如V8引擎)
    • JS引擎等待任务队列中任务的到来,
    • 注意JS线程与GUI线程互斥,若是JS执行的时间过长,就会致使页面渲染不连贯,致使页面渲染加载阻塞
  • 事件触发线程异步

    • 归属浏览器而不是JS引擎,用来控制事件循环
    • 当JS引擎执行代码块,如点击事件,Ajax等会将对应任务添加到事件线程中
    • 当对应的事件被触发时,该线程会把事件添加到待处理队列的尾部,等待JS引擎的处理
    • 因为JS的单线程关系,全部这些待处理事件都要排队等JS引擎处理
  • 定时触发器线程函数

    • setInterval,setTimeout所在线程
    • 浏览器定时计数器并非JS引擎计数的(由于JS引擎是单线程的若是处于阻塞线程状态就会影响计数的准确度)
    • 所以经过单独的线程来计时并触发定时(即便完毕后,添加到事件队列的尾部,等JS引擎空闲后再执行)
    • 另外setTimeout中低于4ms,按4ms计算
  • 异步请求线程布局

    • XMLHttpRequest在链接创建后经过浏览器新开一个线程请求
    • 请求状态变化时,若是有回调函数,异步请求线程产生状态变化事件,将事件放入事件队列,再由JS引擎执行。
  • 第三方插件进程插件

    • 每种插件对应一个进程,仅当使用该插件时才会建立
  • GPU进程线程

    • 最多一个,用于3D绘制等

JS为何单线程

  • JS的主要用途是与用户互动和操做DOM队列

    • 如此若是是多线程会带来同步问题,好比两个线程一个在DOM上添加内容,一个删除了该DOM,会出现冲突
  • 为利用CPU多核的能力,H5中使用Web Worker标准进程

    • 容许JS建立多个线程
    • 可是子线程彻底受主线程控制,且不能够操做DOM
相关文章
相关标签/搜索