谈一谈对浏览器中进程和线程的理解

重点:浏览器是多进程的

主要包括以下进程:

  • Browser进程:浏览器的主进程,唯一,负责创建和销毁其他进程、网络资源的下载与管理、浏览器界面的展示、前进后退等。
  • GPU进程:用于3D绘制等,最多一个。
  • 第三方插件进程:每种类型的插件对应一个进程,仅当使用该插件时才创建。
  • 浏览器渲染进程(浏览器内核):内部是多线程的,每打开一个新网页就会创建一个进程,主要用于页面渲染,脚本执行,事件处理等。

渲染进程(浏览器内核)

浏览器的渲染进程是多线程的,页面的渲染、JavaScript的执行、事件的循环,都在这个进程内进行:

  • GUI渲染线程:负责渲染浏览器界面,当界面需要重绘(Repaint)或由于某种操作引发回流(Reflow)时,该线程就会执行。
  • JavaScript引擎线程:也称为JavaScript内核,负责处理JavaScript脚本程序、解析JavaScript脚本、运行代码等。(例如V8引擎)
  • 事件触发线程:用来控制浏览器事件循环,注意这不归JavaScript引擎线程管,当事件被触发时,该线程会把事件添加到待处理队列的队尾,等待JavaScript引擎处理。
  • 定时触发器线程:传说中的setIntervalsetTimeout所在线程,注意,W3C在HTML标准中规定,规定要求setTimeout中低于4ms的时间间隔算为4ms。
  • 异步http请求线程:在XMLHttpRequest连接后通过浏览器新开一个线程请求,将检测到状态变更时,如果设置有回调函数,异步线程就产生状态变更事件,将这个回调再放入事件队列中。再由JavaScript引擎执行。

⚠️ 注意:GUI渲染线程与JavaScript引擎线程是互斥的,当JavaScript引擎执行时GUI线程会被挂起(相当于被冻结),GUI更新会被保存在一个队列中等到JavaScript引擎空闲时立即被执行。所以如果JavaScript执行的时间过长,这样就会造成页面的渲染不连贯,导致页面渲染加载阻塞。

单线程的JavaScript

所谓的单线程,是指在JavaScript引擎中负责解释和执行JavaScript代码的线程单一,同一时间只能执行一件任务。

文章作者: qinwei
文章链接: https://qw-null.github.io/2022/09/05/谈一谈对浏览器中进程和线程的理解/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 QW's Blog