浏览器是多进程
的.
浏览器的渲染进程
是多线程
的。js
是阻塞单线程
的。
Browser
进程:浏览器的主进程
(负责协调,主控),只有一个
,作用有:
负责浏览器的`界面显示`,`与用户交互`,如前进,后退等
负责各个页面的管理,创建和销毁其它进程
将Rendered进程得到的内存中的Bitmap,绘制到用户界面上
`网络资源的管理,下载`
GPU
进程:最多一个,用于3D绘制
等。
浏览器渲染进程
(浏览器内核
)(Render进程
,内部是多线程
的)
在浏览器
中打开一个网页
相当于新起了一个进程
(进程内有自己的多线程
)
浏览器包含有以下线程:
1.GUI
渲染线程
负责渲染浏览器界面
,解析HTML
,CSS
,构建DOM树
和RenderObject树
,布局和绘制等。
当界面需要重绘(Repaint)
或由于某种操作引发回流(reflow)
时,该线程就会执行
注意,GUI渲染线程与JS引擎线程是互斥的
,当JS引擎
执行时GUI线程
会被挂起
(相当于被冻结了),GUI
更新会被保存在一个队列
中等到JS引擎空闲
时立即被执行
2.JS引擎
线程
也称为JS内核
,负责处理Javascript脚本程序
。(例如V8
引擎)
JS引擎
线程负责解析Javascript脚本,运行代码。
JS引擎一直等待着任务队列中任务
的到来,然后加以处理,一个Tab页(renderer进程
)中无论什么时候都只有一个JS线程
在运行JS程序
同样注意,GUI渲染线程与JS引擎线程是互斥的
,所以如果JS执行
的时间过长
,这样就会造成页面的渲染不连贯
,导致页面
渲染加载阻塞
。
3.事件触发
线程
归属于浏览器
而不是JS引擎,用来控制事件循环
(可以理解,JS引擎自己都忙不过来,需要浏览器另开线程协助
)
当JS引擎执行代码块如setTimeOut
时(也可来自浏览器内核的其他线程,如鼠标点击
、AJAX异步
请求等),会将对应任务
添加到事件线程
中
当对应的事件
符合触发条件
被触发时,该线程会把事件
添加到待处理队列
的队尾
,等待JS引擎
的处理
注意,由于JS的单线程
关系,所以这些待处理队列
中的事件都得排队等待JS引擎处理
(当JS引擎空闲时才会去执行)
4.定时触发器
线程
传说中的setInterval
与setTimeout
所在线程
浏览器定时计数器
并不是
由JavaScript引擎
计数的,(因为JavaScript引擎是单线程
的, 如果处于阻塞线程状态
就会影响记计时的准确
)
因此通过单独线程
来计时并触发
定时(计时完毕后,添加到事件队列中,等待JS引擎空闲后执行
)
注意,W3C在HTML标准中规定,规定要求setTimeout
中低于4ms
的时间间隔算为4ms
。
5.异步http请求
线程
在XMLHttpRequest
在连接后是通过浏览器
新开一个线程请求
将检测到状态变更
时,如果设置有回调函数
,异步线程
就产生状态变更事件
,将这个回调再放入事件队列
中。再由JavaScript引擎
执行。
网友评论