浏览器运行机制笔记

浏览器

概念  进程  类比为工厂   程序的实体  线程的容器

线程   线程是独立调度和分派的基本单位   一个进程可以有多线程  也可以只有一个线程

 

 

浏览器是多进程的,主要分为以下几个进程

Browser进程 主进程

  1. 负责浏览器界面显示,与用户交互。如前进,后退等
  2. 负责各个页面的管理,创建和销毁其他进程
  3. 将Renderer进程得到的内存中的Bitmap,绘制到用户界面上
  4. 网络资源的管理,下载等

 

第三方插件进程

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

 

GPU进程

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

 

浏览器渲染进程(浏览器内核)(Renderer进程,内部是多线程的)

默认每个Tab页面一个进程,互不影响。主要作用为页面渲染,脚本执行,事件处理等

 

在浏览器中打开一个网页相当于新起了一个进程(进程内有自己的多线程)

 

 

前端相关的主要是渲染进程,是多线程的。

渲染进程分为以下几个线程。

 

GUI渲染线程

负责渲染浏览器界面,解析 HTML,CSS ,构建 DOM树和RenderObject树 ,布局和绘制等

当界面需要重绘(Repaint)或由于某种操作引发回流( reflow )时,该线程就会执行

注意,GUI渲染线程与JS引擎线程是互斥的,当JS引擎执行时GUI线程会被挂起(相当于被冻结了),GUI更新会被保存在一个队列中等到JS引擎空闲时立即被执行。(转载译:阐明了js的解析和执行会阻塞页面的渲染)

 

JS引擎线程

 JS内核 ,负责处理 Javascript 脚本程序。(例如 V8引擎)

JS引擎线程负责解析 Javascript 脚本,运行代码。

JS引擎一直等待着任务队列中任务的到来,然后加以处理,一个Tab页( renderer 进程)中无论什么时候都只有一个JS线程在运行JS程序。

同样注意,GUI渲染线程与JS引擎线程是互斥的,所以如果JS执行的时间过长,这样就会造成页面的渲染不连贯,导致页面渲染加载阻塞。

 

事件触发线程

归属于浏览器而不是JS引擎,用来控制事件循环(可以理解,JS引擎自己都忙不过来,需要浏览器另开线程协助)

当JS引擎执行代码块如 setTimeOut 时(也可来自浏览器内核的其他线程,如鼠标点击、AJAX异步请求等),会将对应任务添加到事件线程中

当对应的事件符合触发条件被触发时,该线程会把事件添加到待处理队列的队尾,等待JS引擎的处理

注意,由于JS的单线程关系,所以这些待处理队列中的事件都得排队等待JS引擎处理(当JS引擎空闲时才会去执行)

 

定时触发器线程

传说中的 setInterval 与 setTimeout 所在线程

浏览器定时计数器并不是由JavaScript引擎计数的,(因为JavaScript引擎是单线程的, 如果处于阻塞线程状态就会影响记计时的准确)

因此通过单独线程来计时并触发定时(计时完毕后,添加到事件队列中,等待JS引擎空闲后执行)

注意,W3C在HTML标准中规定,规定要求setTimeout中低于4ms的时间间隔算为4ms。

 

异步http请求线程

XMLHttpRequest在连接后是通过浏览器新开一个线程请求

将检测到状态变更时,如果设置有回调函数,异步线程就产生状态变更事件,将这个回调再放入事件队列中。再由JavaScript引擎执行。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值