learn:how-does-browser-work
目錄表
瀏覽器原理筆記
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
learn/how-does-browser-work.txt · 上一次變更: 2024/12/22 21:17 由 127.0.0.1