# 瀏覽器原理筆記 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 - -