码迷,mamicode.com
首页 > 编程语言 > 详细

浏览器工作原理(一):浏览器的进程与线程

时间:2018-05-15 18:31:46      阅读:182      评论:0      收藏:0      [点我收藏+]

标签:enter   style   插件   blank   9.png   程序   关系   内核   ref   

参考:https://segmentfault.com/a/1190000012925872#articleHeader4

 

一、浏览器是多进程的,浏览器内核是多线程的,js引擎是单线程的

技术分享图片

1、浏览器是多进程的,主要进程包括以下几个:

进程名 个数 作用
浏览器主进程 1个

主控进程,负责协调其他各进程

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

渲染进程

一个Tab页面一个

即,浏览器内核,内部是多线程的,主要作用:

  • 页面渲染
  • 脚本执行
  • 事件处理
  • ……
插件进程 一类插件一个 当使用该插件时才创建
GPU进程 0或1个 用于3D绘制等

2、浏览器内核是多线程的,主要线程包括以下几个: 

线程名 作用 线程关系
GUI渲染线程

负责渲染浏览器界面,包括

  • 解析HTML,CSS,构建DOM树和RenderObject树,布局和绘制等。
  • 重绘(Repaint)及回流(reflow)处理

GUI渲染线程与JS引擎线程是互斥的

  • 由于JavaScript是可操纵DOM的,如果在修改这些元素属性同时渲染界面(即JS线程和UI线程同时运行),那么渲染线程前后获得的元素数据就可能不一致了。
  • 这种互斥关系就是为了防止渲染出现不可预期的结果
  • 当JS引擎执行时GUI线程会被挂起,GUI更新则会被保存在一个队列中等到JS引擎线程空闲时立即被执行
  • 由此也可推断,JS如果执行时间过长就会阻塞页面

 

JS引擎线程

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

  • JS引擎线程负责解析Javascript脚本,运行代码。
  • JS引擎一直等待着任务队列中任务的到来,然后加以处理
  • 一个Tab页(renderer进程)中无论什么时候都只有一个JS线程在运行JS程序
事件触发线程

归属于渲染进程而不是JS引擎,用来控制事件循环

  • 当JS引擎执行代码块如setTimeOut时(也可来自浏览器内核的其他线程,如鼠标点击、AJAX异步请求等),会将对应任务添加到事件线程中
  • 当对应的事件符合触发条件被触发时,该线程会把事件添加到待处理队列的队尾,等待JS引擎的处理

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

 
定时触发器线程

setIntervalsetTimeout所在线程

  • 浏览器定时计数器并不是由JS引擎计数的
  • js引擎是单线程的,如果处于阻塞线程状态就会影响记计时的准确,因此,通过单独的线程来计时并触发定时
  • 计时完毕后,添加到事件队列中,等待JS引擎空闲后执行

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

 
异步http请求线程

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

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

 

 

浏览器工作原理(一):浏览器的进程与线程

标签:enter   style   插件   blank   9.png   程序   关系   内核   ref   

原文地址:https://www.cnblogs.com/zs-note/p/9042282.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!