浏览器多进程,浏览器渲染多线程,JS单线程

人走茶凉 提交于 2020-02-04 05:17:47

一、进程/线程


进程相当于一个公司的某个部门,占据系统分配的一定的内存,互相间不共享资源和空间;

线程相当于部门内的每个职工,多个线程在进程中协作完成任务,共享相同的资源和空间;

 

总结:一个进程中包含多个线程,多个线程共同完成任务;进程间也可以通信,但代价较高。

 

二、浏览器多进程


主要包括几个进程

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

           https://blog.csdn.net/qq_21726139/article/details/82974276

           https://www.jianshu.com/p/a4406de8ab2a

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!