浏览器的多线程

原文链接: http://imweb.io/topic/58e3bfa845e5c13468f567d5

前言

JavaScript是单线程,这个应该都有了解。那么,对于JavaScript的宿主环境,浏览器,浏览器的内核是多线程的。

在内核控制下各线程相互配合以保持同步,一个浏览器通常由以下常驻线程组成:

GUI 渲染线程
JavaScript引擎线程
定时触发器线程
事件触发线程
异步http请求线程

 

而常驻的线程至少有3个:

1、GUI 渲染线程

2、JavaScript引擎线程

3、事件触发线程

 

GUI渲染线程

负责渲染浏览器界面HTML元素,当界面需要重绘(Repaint)或由于某种操作引发回流(reflow)时,该线程就会执行。在Javascript引擎运行脚本期间,GUI渲染线程都是处于挂起状态的,也就是说被”冻结”了.

Javascript引擎线程

也可以称为JS内核,主要负责处理Javascript脚本程序,例如V8引擎。Javascript引擎线程理所当然是负责解析Javascript脚本,运行代码。

 

GUI 渲染线程 与 JavaScript引擎线程互斥!

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

你可能感兴趣的:(浏览器)