Shyno
Don't be shy,no problem!

这块儿主要是大体上理解浏览器的工作流程,对于前端来说,其中渲染部分是最重要的.

 

进程和线程

稍微通俗点来描述它们,就是我一个系统要做一件事,比如造车,要装发动机、机身、轮胎等等子任务.我可以只安排一个人去做,那整个造成的进程就是只有一个线程.但是如果我安排多个人去做,那就是多个线程,而且这几个人可以完全独立且同时工作.这就是线程的并发.

 

浏览器的多进程架构

我们之前说过浏览器由七大部分组成,所以为了统筹这些部分.浏览器采用了多进程的架构.那么它的进程有

1.Browser进程

浏览器的主进程,也就是浏览器从打开到关闭都有参与.它主要是用户界面和浏览器引擎的参与.

2.渲染进程

这也是前端最需要关注的进程.主要参与页面的渲染.当然包含js部分.所以它需要浏览器的渲染引擎和js引擎参与

3.GPU进程

GPU为图形处理器,参与图形相关的渲染.可以在某些手机的开发者选项中看到"强制使用GPU渲染2D图片",就是那个GPU了.

4.插件进程

每用一个插件都会开启一个进程

其中Browser进程和GPU进程每个浏览器就一个,而渲染进程是每开一个页面都会开一个进程,以保证每个页面的渲染都是独立的,而插件进程则是每个页面都有相同数量的插件进程.比如你开了两个插件,两个页面,那就有四个插件进程,以保证每个页面的每个插件都能正常工作.

 

渲染进程

渲染进程包含以下线程:

1.GUI线程(主要负责解析HTML、CSS和渲染页面)

2.JS引擎线程(负责解析和执行JS代码)

3.事件线程(控制事件循环)

4.定时器线程(处理定时器相关逻辑)

5.异步请求线程(发起Ajax时会生成该线程)

结合这段内容,我们可以充分去理解以下的几个问题

 (1)js为什么是单线程?

     因为一个渲染进程只有一个js引擎线程,只有js引擎线程会解析js脚本.其目的是因为用户行为是不可控的,容易出现多线程操作同意dom导致出错的问题.

 (2)html、css的解析和js的解析是同时进行的吗?

      GUI渲染线程与JS引擎线程是互斥的,当JS引擎执行时GUI线程会被挂起,页面的更新操作会等到JS引擎空闲时执行.也就保证了js不再对页面元素进行修改之后再去解析渲染html和css.

 (3)为什么会出现异步问题?

      因为js引擎线程在发异步请求时并不会等待异步请求.因为一旦等待了,将会影响页面加载,请求出错甚至会导致页面崩溃,严重影响用户体验.

 

posted on 2021-09-13 11:07  Shyno  阅读(206)  评论(0编辑  收藏  举报