使用者工具

網站工具


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 · 上一次變更: 2022/06/26 09:04 由 admin_wi1d5ky

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki