⚡ 30 秒速记

  • 浏览器多进程协作,标签页与进程不是固定一一对应
  • 主线程承担脚本、部分样式与布局工作
  • 网络完成不代表回调能立刻执行
  • 工作线程处理计算,结果再交主线程显示
  • 合成可独立推进部分动画,但有条件

浏览器像几个部门协作:网络取资源,主线程处理脚本和页面结构,渲染管线把结果变成画面。 所以网络可以继续传数据,但主线程被长计算占满时,回调和交互仍会延迟。现代浏览器会用多个进程与线程隔离、并行工作,具体分配取决于站点隔离和资源策略。优化时先看忙的是哪一段,再决定减工作量、拆任务或移到工作线程。

版本校准: 原理文章中的代码代表特定实现与写作时间。应用到当前项目时,应先确认浏览器、框架或工具的主版本,再区分稳定的规范语义、可变化的内部实现和项目自身约束。

# 线程和进程

进程和线程的概念可以这样理解:

进程是一个工厂,工厂有它的独立资源--工厂之间相互独立--线程是工厂中的工人,多个工人协作完成任务--工厂内有一个或多个工人--工人之间共享空间

工厂有多个工人,就相当于一个进程可以有多个线程,而且线程共享进程的空间。

进程是cpu资源分配的最小单位(是能拥有资源和独立运行的最小单位,系统会给它分配内存) 线程是cpu调试的最小单位(线程是建立在进程的基础上的一次程序运行单位,一个进程中可以有多个线程。核心还是属于一个进程。)

# 浏览器是多进程的

浏览器是多进程的,每打开一个tab页,就相当于创建了一个独立的浏览器进程。

# 浏览器包含的进程:

  1. Browser进程:浏览器的主进程(负责协调,主控),只有一个,作用有:
    • 负责浏览器的界面显示,与用户交互,如前进,后退等
    • 负责各个页面的管理,创建和销毁其它进程
    • 将Rendered进程得到的内存中的Bitmap,绘制到用户界面上
    • 网络资源的管理,下载
  2. 第三方插件进程:每种类型的插件对应一个进程,仅当使用该插件时才创建。
  3. GPU进程:最多一个,用于3D绘制等。
  4. 浏览器渲染进程(浏览器内核)(Render进程,内部是多线程的):默认每个Tab页面一个进程,互不影响。主要作用为:
    • 页面渲染,脚本执行,事件处理等

在浏览器中打开一个网页相当于新起了一个进程(进程内有自己的多线程)

# 浏览器多进程的优势

  • 避免单个page crash影响整个浏览器
  • 避免第三方插件crash影响整个浏览器
  • 多进程充分利用多核优势
  • 方便使用沙盒模型隔离插件等进程,提高浏览器稳定性

简单理解就是:如果浏览器是单进程的,某个Tab页崩溃了,就影响了整个浏览器,体验就会很差。同理如果是单进程的,插件崩溃了也会影响整个浏览器; 当然,内存等资源消耗也会更大,像空间换时间一样。

# 重点是浏览器内核(渲染进程)

对于普通的前端操作来说,最重要的渲染进程:页面的渲染,js的执行,事件的循环等都在这个进程内执行;

浏览器是多进程的,浏览器的渲染进程是多线程的;

# GUI渲染线程

  • 负责渲染浏览器界面,解析HTML,CSS,构建DOM树和RenderObject树,布局和绘制等。
  • 当界面需要重绘或由于某种操作引发回流时,该线程就会执行。
  • 注意,GUI渲染线程与JS引擎线程是互斥的,当JS引擎执行时GUI线程会被挂起(相当于冻结了),GUI更新会被保存在一个队列中等到JS引擎空闲时立即被执行。
webapp
公众号
开发者导航
切换夜间模式
点击侧边栏上一篇
点击侧边栏下一篇
折叠侧边栏
收起全部