浏览器的多进程问题

754 阅读6分钟

浏览器为多进程

1.每个tab都有一个进程,进程之间互不干扰,多个空白tab会被合并到一个进程
2.浏览器进程类型分为:
    browser进程:浏览器主进程,包含子进程,主要用于用户交互、页面展示、浏览器存储等
    unitify Network进程:网络请求进程,主要用于网络请求交互
    插件进程:主要加载插件的进程
    GPU进程:GPU加载进程,主要加载渲染UI页面,页面布局、重绘的进程,包括3D渲染
    render进程:内核进程,主要用来页面渲染(GUI线程)、加载js(js引擎线程),是js的运行进程,遵循js运行机制

1.browser进程

1.浏览器的主进程,只有一个
2.负责浏览器的界面显示、与用户交互,如前进后退
3.负责其他页面的管理,创建、销毁其他进程
4.将renderer进程得到的内存中bitmap,绘制到用户界面上

2.unitify Network进程

1.负责网络请求、下载等

3.插件进程

1.每种类型的插件对应一个进程,且仅当使用时才创建

4.GPU进程

1.最多一个,用于3D渲染
    

5.render进程

1.用于执行页面渲染、脚本执行、事件处理等
2.包括GUI线程、js引擎线程、webWorker线程、事件触发线程、定时器线程、异步http请求线程

3.GUI渲染线程
    1.解析html、css,构建dom树和renderObject树,布局和绘制
    2.页面重绘(replaint)和回流(reflow)时,该线程被执行
    3.GUI渲染线程和js引擎线程是互斥的,当js引擎执行时,GUI线程会被挂起,保存到一个队列中,等js引擎空闲时立即被执行

4.js引擎线程
    1.js内核,负责处理js脚本程序
    2.解析js脚本,运行js代码
    3.一个render进程中只有一个js线程在运行js代码
    4.js引擎线程和GUI渲染现场是互斥的,js线程如果执行时间过长,会造成页面渲染不连贯,导致页面渲染加载阻塞
   
5.事件触发线程
    1.此线程归属浏览器而非js引擎,用来控制时间循环
    2.点击事件、ajax等异步操作时,会将对应的任务添加到事件的线程中处理
    3.当对应的事件被触发是,该线程会把处理队列中的事件加入待处理队列的尾部,等待js引擎空闲处理执行

6.定时器线程
    1.settimeout和setInterval所在的线程
    2.通过该线程计时并触发,添加到事件队列中,等待js引擎空闲执行
    
7.异步http请求线程
    1.在XMLHttpRequest在连接过通过浏览器新开的一个线程请求
    2.当检测到状态发生变更时,如果有回调函数,异步线程会产生状态变更事件,将回调加入事件队列中,等待js引擎空闲执行
    
8.browser进程和render进程的通信
    1.browser进程收到用户请求,首先需要获取页面内容(如通过网络下载资源),随后将该任务通过RendererHost接口传递给Render进程
    2.Render进程的Render接口收到消息,交给渲染线程,开始渲染
        a.渲染线程接收请求、加载网页并渲染(这个过程中可能需要browser进程获取资源和GPU进程帮助渲染)
        b.js线程操作dom(可能回流以及重绘)
        c.render进程将结果返回给browser进程
    3.browser进程接收结果并绘制
    

image.png

9.webworker
    html5新增,通过possMessage通讯
    具体另外补充
    

6.浏览器渲染过程

1.浏览器输入url后经历了什么
    输入url--浏览器主进程接管(开一个下载线程)--http请求--dns解析--tcp/ip通讯连接--浏览器服务器的通讯--查找缓存(浏览器、本地)--关闭连接--拿到内容通过rendererHost接口交给Render进程--浏览器渲染
2.load事件和DOMContentLoaded事件
a.DOMContentLoaded是DOM加载完成后就可以执行了,不需要js、img、css
b.load是dom、css、js、img全部加载完成后执行
3.css加载是否阻塞dom树渲染
a.不会阻塞dom解析
b.会阻塞render树渲染

7.浏览器渲染步骤

a.解析html构建dom树
b.解析css构建renderObject树
c.dom树和renderObject树合并成render树
d.布局render树(layout/reflow),负责各元素的尺寸、位置的计算
e.绘制render树(paint/repaint),负责页面像素信息
f.浏览器将各层信息发给GPU,GPU会将各层合成,显示屏幕上

image.png

8.js运行机制

1.js为单线程
    // 这里需要做补充,暂时不做
2.js任务分为同步任务和异步任务
    
3.js事件循环机制loop原理
    a.因为js为单线程,所以会出现阻塞问题,为解决这个问题js将任务事件分为同步任务和异步任务
    b.同步任务在主线程中自上而下运行,先进先出原则
    c.异步任务在任务队列中运行,等到主线程中的同步任务直接完毕,调用任务队列中的事件,先进先出原则
    d.异步任务又分为宏任务和微任务:
        宏任务有setTimeoutsetInterval
        微任务有promise、nextTick等
        微任务优先于宏任务运行
4.js运行过程
    a.语法解析,js会先进行语法解析,检测出一些语法错误
    b.预解析,js会将函数定义名称和变量定义提升到整体的前面
    c.参数统一,找到函数的参数,形参和实参统一(这个需要备注一下,需要丰满)
    d.执行顺序,自上而下,遵循js运行机制
    
5.js运行过程拓展
    a.预处理和预解析
    1).生成一个词法环境LE,等同于window
    2).处理是变量和函数,变量是var声明的变量,函数是声明的方式声明的函数(注意:一定不是喊表达式)
    3).将变量和函数提到LE环境的最前面
    4).同名处理规则,函数同名会覆盖,变量同名会忽略,函数变量同名函数权重高
    
    b.js作用域和作用域链
    1).js作用域为静态作用域,在词法解析阶段就已经确定了作用域
    2).var 变量的作用域为定义他的函数fn内部或者最外层LE环境中,及window
    3).声明方式的函数作用域为调用他外层函数fn2内或者LE中(window4).letconstvar区别,备注一下,下次专门补充
    
    c.调用函数时,形参和实参浅析
    1).调用函数的参数为实参。函数声明时的参数为形参
    2).形参相当于直接在函数体内声明了一个变量名称
    3).实参形参只是顺序对应,键名无关,且数据类型要相同
    4).当实参为基本数据类型时,在函数运行时,形参和实参是不同的变量,形参相当于是实参的拷贝,内外互不影响
    5).当实参为引用类型变量时,在调用该函数的过程中,传给函数的是是实参的指针地址,两者共同指向同一地址,形参相当于实参的拷贝,内外互相影响,此次拷贝为浅拷贝;当函数调用时,函数体内部形参用=号赋值时,改变了自身指针指向,内外互不影响,此次拷贝为深拷贝