一、进程/线程
进程相当于一个公司的某个部门,占据系统分配的一定的内存,互相间不共享资源和空间;
线程相当于部门内的每个职工,多个线程在进程中协作完成任务,共享相同的资源和空间;
总结:一个进程中包含多个线程,多个线程共同完成任务;进程间也可以通信,但代价较高。
二、浏览器多进程
主要包括几个进程
Browser进程: 浏览器主进程,有且仅有一个
负责浏览器界面显示,页面管理,与用户交互(前进,后退)
是其他类型进程的祖先,负责其他进程的创建和销毁
第三方插件进程: 每个插件都是一个进程,使用时创建
GPU进程: 最多一个,仅当GPU硬件加速打开时被创建
用于3D图形绘制
浏览器渲染进程(浏览器内核)(Renderer进程,内部是多线程的):
默认每一个tab页都是一个进程,互不影响,但renderer进程的数量并不一定与打开的tab页数量一致
负责页面渲染,脚本执行,时间处理等。
浏览器多线程总结与优势
browser进程与渲染进程分开 | 单个页面崩溃不会影响整个浏览器的运行 |
插件进程是独立的 | 插件出问题不会影响浏览器和网页的运行 |
GPU硬件加速是独立的 | |
每个页面都是独立的进程 | 页面间基本不会互相影响 |
三、浏览器渲染多线程
主要包括几个线程
GUI线程(主线程)
- 负责渲染浏览器界面,解析HTML、CSS、构建DOM树和RenderObject树,布局和绘制等
- 当界面需要重绘(例如color,背景色等的改变),重排(只要涉及到页面中dom元素的尺寸的读取或者更改都可能会触发重排,需要说明的是重排一定会触发重绘,而重绘不会触发重排)时,该线程就会执行
- GUI渲染线程和JS引擎线程是互斥的,当js引擎执行时GUI线程会被挂起(相当于冻结),GUI更新会被保存在一个队列中等到js引擎空闲时立即执行
JS引擎线程
- 也称为js内核,负责处理javascript脚本程序(V8引擎)
- JS引擎线程负责解析javascript脚本,运行代码
- js脚本运行的代码会按代码的执行顺序依次被添加到一个执行队列中(定时器除外),按先进先出的原则执行,一个renderer进程中无论如何都只有一个js线程在运行js程序。通常所说的js是单线程就是这块的内容
- 由于GUI渲染线程和JS引擎线程是互斥的,所以如果JS执行时间如果过长,这样就会造成页面渲染不连贯,导致页面渲染加载阻塞
事件触发线程
- 归属于浏览器而不是js引擎,用来控制事件循环
- 当js引擎执行代码,如setTimeout时(也可以是来自浏览器内核的其他线程,如鼠标点击,ajax请求等),会将对应的任务添加到事件线程当中
- 当对应的事件符合触发条件被触发时,事件线程会把事件添加到待处理事件队列的队尾,等待js引擎的处理
- 由于js的单线程关系,所以这些待处理队列中的事件都得排队等待js引擎处理(当js引擎空闲时才会去执行)
定时器线程
- setInterval和setTimeout所在的线程
- 浏览器定时计数器并不是由js引擎计数的(因为js是单线程的,如果处于阻塞状态就会影响计数的准确性)
- 由单独的线程(事件触发线程)来计时并触发定时(计时完毕后,添加到事件队列中,等待js引擎空闲后执行)
- W3C在HTML标准中规定,规定要求setTimeout中低于4ms的时间间隔算为4ms
异步请求线程(http请求)
- 在XMLHttpRequest在连接后通过浏览器开一个线程请求
- 将检测到状态变更时,如果有设置有回调函数,异步线程就产生状态变更事件,将这个回调再放入事件队列中,再有js引擎执行
参考:https://blog.csdn.net/qq_21726139/article/details/82974076
来源:CSDN
作者:君-
链接:https://blog.csdn.net/weixin_39307273/article/details/104154113