关于浏览器的渲染

有几个问题

1.浏览器是多进程多线程的

2.浏览器每个tab页都是一个独立的进程吗,比如a标签新开页面,同源页面,多个空白tab页,是都算每个都是独立的进程吗,不同浏览器也都是这么算的吗

      好像谷歌是每个tab页都是独立进程,其他浏览器可能会考虑a标签,同源,空白tab啥的,可能这些是合成为同一个进程把

3.浏览器有很多个进程,他们之前是怎么并列的

  • Browser进程:浏览器的主进程(负责协调、主控),只有一个
  • 第三方插件进程:每种类型的插件对应一个进程,仅当使用该插件的时候才创建
  • GPU进程:最多一个,用于3D绘制
  • 浏览器渲染进程(内核):默认每个tab页面一个进程,互不影响,控制页面渲染,脚本执行,事件处理等(有时会优化,如多个空白tab会合成一个进程)

4.每个tab页进程里应该都是由另外几个进程的吧?,然后有自己tab页独立的那些线程

1)GUI 渲染线程:

负责渲染页面,解析 HTML,CSS 构成 DOM 树等,当页面重绘或者由于某种操作引起回流都会调起该线程。
和 JS 引擎线程是互斥的,当 JS 引擎线程在工作的时候,GUI 渲染线程会被挂起,GUI 更新被放入在 JS 任务队列中,等待 JS 引擎线程空闲的时候继续执行。

2)JS 引擎线程:

单线程工作,负责解析运行 JavaScript 脚本。
和 GUI 渲染线程互斥,JS 运行耗时过长就会导致页面阻塞。

3)事件触发线程:

当事件符合触发条件被触发时,该线程会把对应的事件回调函数添加到任务队列的队尾,等待 JS 引擎处理。

4)定时器触发线程:

浏览器定时计数器并不是由 JS 引擎计数的,阻塞会导致计时不准确。
开启定时器触发线程来计时并触发计时,计时完成后会被添加到任务队列中,等待 JS 引擎处理。

5)http 请求线程:

http 请求的时候会开启一条请求线程。
请求完成有结果了之后,将请求的回调函数添加到任务队列中,等待 JS 引擎处理。

 

既然按这样渲染进程的线程分为这些,js引擎,定时器,事件啥的,那我之前那篇宏任务.微任务和事件队列的博客说的就不太专业了, https://blog.csdn.net/qq_41430522/article/details/114274124  ,应该要结合事件队列,执行栈,异步队列什么的来综合解释  

关于事件队列与渲染进程的一些说法,看看这篇博客https://blog.csdn.net/zfz5720/article/details/104698545

 

关于线程和进程 https://www.cnblogs.com/yuanchenqi/articles/6755717.html       

关于浏览器的进程和线程  https://www.cnblogs.com/blackgan/p/11107317.html     https://segmentfault.com/a/1190000017019877

GPU进程应该就是和显卡有关吧,3d绘图性能,比如一些webgl的页面,一些3d页面,手机电脑的GPU也都是3d绘制能力为主,估计这个进程调用的是电脑的显卡

所以显卡越好,那么3d绘图性能当然越好,那浏览器渲染3d画面也就越流畅

5.关于js到底是单线程还是多线程

 在我看来,js应该是多线程的,它在浏览器是单线程,在nodejs中是多线程

之所以在浏览器中是单线程,是因为浏览器只分了一个线程给它    因为浏览器只渲染一个页面,如果是多个线程,那么到底以哪个线程为主呢,所以在浏览器中要保持一个js线程

6.关于多线程 同步异步 与浏览器js单线程的一些理解

刚开始我看到浏览器渲染进程有五个线程的时候,GUI 渲染.js引擎.事件触发.定时器触发.http请求等线程的时候:,突然觉得这样的话,虽然只给了js代码执行一个js引擎线程,但是有这其他的四个线程帮着执行,

不也算是多线程吗

后来又醒悟,这并不是真正的多线程,如果是多线程的话,比如有两个js引擎线程,那么他们就会同时执行不同的代码,注意是同时执行,这样的话就是多线程

而可以看到这五个线程其实能够执行js代码的也就只有js引擎线程,其他线程都要等着排队把代码放到js引擎线程执行,也就是只有一个js引擎在执行代码,,...典型的单线程,

而同步异步又是什么呢,其实就是因为js在浏览器只被分配了一个js引擎,这种单线程一旦遇到耗时很长的代码,就会阻塞很长时间,所以,为了不让这种事情发生,就有了同步异步

在js引擎运行的时候,执行代码的过程中,遇到耗时长的代码,比如定时器,一些请求什么的,就会先不执行,而是放到其他事件触发.定时器触发.http请求等线程中,然后自己继续往下执行

而那些被放进去的任务,也会等待自己耗时长的任务耗时结束,也就是处理好了,等待执行,然后等js引擎执行完,然后它们按照在自己线程中(定时器.事件等线程里)的耗时长短顺序一个个去js引擎里执行,

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值