浏览器的多进程包括:

1.Browser进程:浏览器的主进程(负责协调、主控),只有一个

2.第三方插件进程:每种类型的插件对应一个进程,仅当使用该插件时才创建

3.GPU进程:最多一个,用于3D绘制等

4.浏览器渲染进程(浏览器内核内部是多线程的):默认每个Tab页面一个进程,互不影响。

浏览器渲染进程包括:

  1. GUI渲染线程
  2. JS引擎线程
  3. 事件触发线程
  4. 定时器触发线程
  5. 异步http请求线程

GUI渲染线程:负责浏览器渲染,重排重绘。

注意,GUI渲染线程与JS引擎线程是互斥的,当JS引擎执行时GUI线程会被挂起,GUI更新会被保存在一个队列中等到JS引擎空闲时立即被执行。

渲染完毕后会触发load事件:
DOMContentLoaded(仅当DOM加载完成,不包括样式表,图片) -> onload(页面上所有的DOM,样式表,脚本,图片都已加载完成)

css是由单独的下载线程异步下载的,css加载不会阻塞DOM树解析(异步加载时DOM照常构建)
但会阻塞render树渲染(渲染时需等css加载完毕,因为render树需要css信息)

JS引擎线程:负责处理Javascript脚本程序。是主线程,一直等待着任务队列中任务的到来。

js是单线程处理,执行时间过长会阻塞页面,所以HTML5中支持了Web Worker。

这样理解下:

  • 创建Worker时,JS引擎向浏览器申请开一个子线程(子线程是浏览器开的,完全受主线程控制,而且不能操作DOM)
  • JS引擎线程与worker线程间通过特定的方式通信(postMessage API,需要通过序列化对象来与线程交互特定的数据)

JS引擎是单线程的,这一点的本质仍然未改变,Worker可以理解是浏览器给JS引擎开的外挂,专门用来解决那些大量计算问题。

事件触发线程:归属于浏览器而不是JS引擎,用来控制事件循环。维护一个任务队列,当使用setTimeout或setInterval时,需要定时器触发线程计时,计时完成后才将其回调函数加入任务队列。

  • 当JS引擎执行代码块如setTimeOut时(也可来自浏览器内核的其他线程,如鼠标点击、AJAX异步请求等),会将对应任务添加到事件线程中
  • 当对应的事件符合触发条件被触发时,该线程会把事件添加到待处理队列的队尾,等待JS引擎的处理
  • 注意,由于JS的单线程关系,所以这些待处理队列中的事件都得排队等待JS引擎处理(当JS引擎空闲时才会去执行)

定时器触发线程:setInterval与setTimeout所在线程

  • 浏览器定时计数器并不是由JavaScript引擎计数的,(因为JavaScript引擎是单线程的, 如果处于阻塞线程状态就会影响记计时的准确)
  • 因此通过单独线程来计时并触发定时(计时完毕后,添加到事件队列中,等待JS引擎空闲后执行)

补充:

WebWorker与SharedWorker

  • WebWorker只属于某个页面,不会和其他页面的Render进程(浏览器内核进程)共享所以Chrome在Render进程中(每一个Tab页就是一个render进程)创建一个新的线程来运行Worker中的JavaScript程序。
  • SharedWorker是浏览器所有页面共享的,不能采用与Worker同样的方式实现,因为它不隶属于某个Render进程,可以为多个Render进程共享使用。所以Chrome浏览器为SharedWorker单独创建一个进程来运行JavaScript程序,在浏览器中每个相同的JavaScript只存在一个SharedWorker进程,不管它被创建多少次。

看到这里,应该就很容易明白了,本质上就是进程和线程的区别。SharedWorker由独立的进程管理,WebWorker只是属于render进程下的一个线程

进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位

线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位.线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源.

浏览器的多进程与js单线程相关推荐

  1. js 多个定时器_从浏览器多进程到JS单线程,JS运行机制最全面的一次梳理(二)

    作者:撒网要见鱼   https://segmentfault.com/a/1190000012925872 本文接上篇 <从浏览器多进程到JS单线程,JS运行机制最全面的一次梳理(一)> ...

  2. 从浏览器多进程到JS单线程,JS运行机制最全面的一次梳理

    最近发现有不少介绍JS单线程运行机制的文章,但是发现很多都仅仅是介绍某一部分的知识,而且各个地方的说法还不统一,容易造成困惑. 因此准备梳理这块知识点,结合已有的认知,基于网上的大量参考资料,从浏览器 ...

  3. js中当等于最小值是让代码不执行_从浏览器多进程到JS单线程,JS运行机制最全面的一次梳理...

    前言 见解有限,如有描述不当之处,请帮忙及时指出,如有错误,会及时修正. ----------超长文+多图预警,需要花费不少时间.---------- 如果看完本文后,还对进程线程傻傻分不清,不清楚浏 ...

  4. JS(单线程)与浏览器(多进程)

    文章目录 进程与线程 JS(单线程) 浏览器(多进程) 渲染进程中的主要线程 浏览器的进程模型.线程模型 浏览器内多标签页之间通信方式 进程间通信的方式 进程与线程 1.进程: 进程是CPU资源分配的 ...

  5. 浅谈浏览器多进程与JS线程

    引言 一直对浏览器的进程.线程的运行一无所知,经过一次的刷刷刷相关的博客之后,对其有了初步的了解,是时候该总结一波了. 进程.线程之间的关系 一个进程有一个或多个线程,线程之间共同完成进程分配下来的任 ...

  6. 浅谈浏览器多进程与JS线程 1

    面试被问到了浏览器线程,没答出来,最终还是感谢拿到了offer 对于浏览器的知识还是知道的太少了,开始恶补TAT 文章目录 一.进程.线程之间的关系 二.浏览器内的进程 三.浏览器内核(渲染进程) 四 ...

  7. 浏览器多线程和js单线程

    0.前言 开发过程中遇到js线程和ui渲染线程互斥问题.导致ui无法正常更新等问题.这些问题的根源就是因为浏览器的多线程和js的单线程引起的. 看本篇博客之前,应该充分理解消息队列,事件循环,同步异步 ...

  8. 五、JS单线程运行原理与多线程

    一.进程与线程 进程:正在执行的程序为一个进程.程序的一次运行,它会占用一片独立的内存空间.称为进程线程:线程是进程内一个独立的执行单元.1.一个进程中至少一个运行的线程,称为主线程.进程启动后自动创 ...

  9. JS基础知识(三十):JS单线程

    文章目录 1.进程和线程 2.浏览器的多进程 3.js单线程 4.同步任务和异步任务(广义) 5.异步实现:任务队列和事件循环 任务队列 事件循环 宏任务(macro-task).微任务(micro- ...

最新文章

  1. WPF DispatcherTimer(定时器应用) 无人触摸60s自动关闭窗口
  2. StringBuilder的toString方法
  3. spring cloud gateway的stripPrefix配置
  4. 【CodeForces - 618A】Slime Combining(二进制,思维)
  5. go去掉最后一个字符_Go语言去除字符串中的指定字符
  6. php怎么获得产品id,php – 如何获取Woocommerce产品中的Variation ID
  7. 机器学习笔记-LightGBM
  8. 用IT技术玩金融系列文章
  9. CAD图纸可以约束转换后图纸格式的大小吗?
  10. 如果时光倒流,我会这样学java
  11. 学习总结:即时通讯项目里面的语音处理-文件模式录音
  12. innerhtml与outerhtml的区别
  13. 管家婆设计页面用什么做的_管家婆软件主要是用来做什么的?
  14. 利用雪碧图及css自制的动态变色导航栏
  15. 卡方检验的统计量推导_卡方检验如何计算?
  16. catia 二次开发:获得投影视图
  17. jmeter perfMon插件的使用
  18. 信息系统项目管理师考前10天极限冲刺+答案(七)
  19. 22_ue4进阶末日生存游戏开发[EQS]
  20. 如何参与到开源优测-积微速成计划任务

热门文章

  1. 怎样制作刷机包,让你的rom更个性
  2. 欢聚时代yy面试经,时间2018(凉凉)
  3. PSP模拟器截图CG的高清化-Waifu2x
  4. Sublime Text3中文乱码解决方案
  5. wyh的考核(dp/容斥原理)
  6. 电脑截图软件测试,电脑截图的快捷键是什么
  7. 抽象代数之pq阶群的结构其中q能整除p-1
  8. 一文看懂GFS如何搭建
  9. 系统启动其实就2个步骤BIOS和MBR(和之后的init/systemd的关系)
  10. UDS学习之:ISO-14229 简介