⚡ 30 秒速记
- 浏览器多进程协作,标签页与进程不是固定一一对应
- 主线程承担脚本、部分样式与布局工作
- 网络完成不代表回调能立刻执行
- 工作线程处理计算,结果再交主线程显示
- 合成可独立推进部分动画,但有条件
浏览器像几个部门协作:网络取资源,主线程处理脚本和页面结构,渲染管线把结果变成画面。 所以网络可以继续传数据,但主线程被长计算占满时,回调和交互仍会延迟。现代浏览器会用多个进程与线程隔离、并行工作,具体分配取决于站点隔离和资源策略。优化时先看忙的是哪一段,再决定减工作量、拆任务或移到工作线程。
版本校准: 原理文章中的代码代表特定实现与写作时间。应用到当前项目时,应先确认浏览器、框架或工具的主版本,再区分稳定的规范语义、可变化的内部实现和项目自身约束。
# 线程和进程
进程和线程的概念可以这样理解:
进程是一个工厂,工厂有它的独立资源--工厂之间相互独立--线程是工厂中的工人,多个工人协作完成任务--工厂内有一个或多个工人--工人之间共享空间
工厂有多个工人,就相当于一个进程可以有多个线程,而且线程共享进程的空间。

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

浏览器是多进程的,每打开一个tab页,就相当于创建了一个独立的浏览器进程。
# 浏览器包含的进程:
Browser进程:浏览器的主进程(负责协调,主控),只有一个,作用有:- 负责浏览器的界面显示,与用户交互,如前进,后退等
- 负责各个页面的管理,创建和销毁其它进程
- 将
Rendered进程得到的内存中的Bitmap,绘制到用户界面上 - 网络资源的管理,下载
- 第三方插件进程:每种类型的插件对应一个进程,仅当使用该插件时才创建。
GPU进程:最多一个,用于3D绘制等。- 浏览器渲染进程(浏览器内核)(
Render进程,内部是多线程的):默认每个Tab页面一个进程,互不影响。主要作用为:- 页面渲染,脚本执行,事件处理等
在浏览器中打开一个网页相当于新起了一个进程(进程内有自己的多线程)
# 浏览器多进程的优势
- 避免单个
page crash影响整个浏览器 - 避免第三方插件
crash影响整个浏览器 - 多进程充分利用多核优势
- 方便使用沙盒模型隔离插件等进程,提高浏览器稳定性
简单理解就是:如果浏览器是单进程的,某个Tab页崩溃了,就影响了整个浏览器,体验就会很差。同理如果是单进程的,插件崩溃了也会影响整个浏览器;
当然,内存等资源消耗也会更大,像空间换时间一样。
# 重点是浏览器内核(渲染进程)
对于普通的前端操作来说,最重要的渲染进程:页面的渲染,js的执行,事件的循环等都在这个进程内执行;
浏览器是多进程的,浏览器的渲染进程是多线程的;
# GUI渲染线程
- 负责渲染浏览器界面,解析
HTML,CSS,构建DOM树和RenderObject树,布局和绘制等。 - 当界面需要重绘或由于某种操作引发回流时,该线程就会执行。
- 注意,
GUI渲染线程与JS引擎线程是互斥的,当JS引擎执行时GUI线程会被挂起(相当于冻结了),GUI更新会被保存在一个队列中等到JS引擎空闲时立即被执行。