目錄表
瀏覽器原理筆記
1. GUI renderer thread
2. JS engine thread
3. 事件觸發 thread
定時觸發器 thread
异步 http 请求 thread
Ref
瀏覽器原理筆記
Browser 是 multiprocessing ,包含:
Browser process
:浏览器的 main process,只有一个。负责浏览器界面显示,与用户交互。负责各个页面的管理,创建和销毁其他 process。将 Renderer process 得到的内存中的 Bitmap,绘制到用户界面上。网络资源的管理,下载等
GPU process
:最多一个,用于 3D 绘制。我们常说的启动硬件加速渲染使用的 process,就是這個
Renderer process
:多个,默认每个Tab 頁为一个 renderer process。其中包含:GUI 渲染线程、js 引擎线程、事件触发线程、定时触发器线程、异步 http 请求线程等
其他 process
:如 extension process 等
其中,Renderer process 有下面這些:
1. GUI renderer thread
负责渲染浏览器界面,解析HTML、CSS、构建 DOM 树和 RenderObject 树,布局和绘制等
当界面需要重绘(Repaint)或由于某种操作引发回流(reflow)时,该线程就会执行
GUI渲染线程与JS引擎线程是互斥的,当JS引擎执行时
GUI
线程会被挂起(相当于被冻结了),GUI更新会被保存在一个队列中等到JS引擎空闲时立即被执行。
2. JS engine thread
如V8引擎。JS内核,负责处理 Javascript 脚本程序
JS 引擎负责解析、运行 Javascript 脚本
JS 引擎一直等待着任务队列中任务的到来,然后加以处理
一个Tab页(renderer进程)中无论什么时候都只有一个 JS 线程
GUI渲染线程与JS引擎线程是互斥的,所以如果 JS 执行的时间过长,会导致页面渲染加载阻塞。
3. 事件觸發 thread
可以理解为 JS 引擎事务处理不过来,分出来一部分(事件触发部分),需要浏览器另开一个线程来协助。事件触发线程归属于浏览器而不是JS引擎,用来控制事件循环
当JS引擎执行代码块如 AJAX异步请求时,会将对应任务添加到事件线程中,当对应的事件符合触发条件被触发时,该线程会把事件添加到待处理队列的队尾,等待JS引擎的处理
由于JS的单线程关系,所以这些待处理队列中的事件都得排队等待JS引擎处理
定時觸發器 thread
setInterval与setTimeout所在线程
浏览器定时计数器并不是由JavaScript引擎计数的 —- 因为JavaScript引擎是单线程的, 如果处于阻塞线程状态就会影响记计时的准确 因此通过单独线程来计时并触发定时(计时完毕后,添加到事件队列中,等待JS引擎空闲后执行)
注意,W3C在HTML标准中规定,规定要求setTimeout中低于4ms的时间间隔算 4ms
异步 http 请求 thread
在XMLHttpRequest在连接后是通过浏览器新开一个线程请求
将检测到状态变更时,如果设置有回调函数,异步线程就产生状态变更事件,将这个回调再放入事件队列中。再由JavaScript引擎执行
Ref
https://zhuanlan.zhihu.com/p/396351215
https://ithelp.ithome.com.tw/m/articles/10242047