从浏览器多进程到JS单线程
浏览器多进程
每打开一个tab标签就会开启一个独立的进程
浏览器都包含了哪些进程
Browser进程:
浏览器的主进程,只有一个,作用有- 负责浏览器界面显示,与用户交互。比如前进、后退
- 负责各个页面的管理,创建和销毁其它进程
- 负责与渲染进程交流
- 网络资源的管理,下载等
第三方插件进程:
GPU进程:
浏览器渲染进程:
- 页面的渲染和绘制,脚步执行,事件处理等
浏览器多进程的优势
- 避免关闭单个页面影响整个浏览器
- 避免第三方插件影响整个浏览器
渲染进程
- 页面的渲染和绘制,脚步执行,事件处理等
- GUI渲染线程
- 负责渲染浏览器页面,解析HTML,CSS,构建DOM树和RENDER树,布局和绘制
- 当界面需要重绘或者由于回流时,该线程会执行
- GUI线程和JS线程是互斥的
- JS线程
- 解析执行JS脚本
- 当JS线程上没有任务时,就去执行任务队列中的事件
- 事件触发线程
- 定时器线程
- setTimeout:定时器,到达指定时间间隔后把回调函数推入事件任务队列,并等待JS引擎执行
- setInterval:计数器,每次都精确的按照指定的时间间隔把回调函数推人事件任务队列,并等待JS引擎执行
- 一般用递归+setTimeout模拟setInterval,因为setInterval的事件执行时间不一定执行准确,可能下一个事件开始执行了,上一个任务还没有结束
- 异步HTTP请求线程
浏览器内核中线程之间的关系
- GUI线程和JS线程互斥
- JS阻塞页面加载
从Event Loop谈JS运行机制
- 同步任务:在JS主线程上形成一个执行栈
- 异步任务:调用事件触发线程,只要异步任务有了结果,就将任务推入事件任务队列
- 总是要的等到执行栈空了以后才会去执行事件任务队列里的任务