什么是浏览器的多进程和多线程?

我们要理解浏览器进程和线程之间的关系,首先要了解什么是进程?什么是线程?

进程

进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位。

示例

打开谷歌浏览器,随便打开几个网页,按下shift esc键,界面将显示目前浏览器启动的几个进程,还有相应的进程内存占用空间、CPU核数、进程ID等等。

在浏览器中新打开一个tab页,浏览器会开启一个新的进程,但是,这并不意味着,浏览器上每一个tab页就是一个进程,因为

有的页面是通过链接跳转打开的,熟悉前端的朋友知道html里的a标签

打开tab

可以新开一个tab页,这新开的和原先的属于同一进程。

浏览器进程(Browser进程)

浏览器的主进程(负责协调、主控),只有一个。作用有

  1. 负责浏览器界面显示,与用户交互。如前进,后退等
  2. 负责各个页面的管理,创建和销毁其他进程
  3. 将Renderer进程得到的内存中的Bitmap,绘制到用户界面上
  4. 网络资源的管理,下载等

GPU进程:

最多一个,用于3D绘制等,可禁止掉。

浏览器渲染进程(Renderer进程,内部是多线程的)

每一个标签页的打开都会创建一个浏览器渲染进程(浏览器内核)。默认每个Tab页面一个进程,互不影响。主要作用为页面渲染,脚本执行,事件处理等

线程

线程(英语:thread)是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。

一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。

一个程序运行会启动多个进程,而进程里又包含了多个线程,多个线程为进程服务。

下图为浏览器渲染进程中存在的各个线程

GUI渲染线程

负责渲染浏览器界面,解析HTML,CSS,构建DOM树和RenderObject树,布局和绘制等。

当界面需要重绘(Repaint)或由于某种操作引发回流(reflow)时,该线程就会执行

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

JS引擎线程

也称为JS内核,负责处理Javascript脚本程序。(例如V8引擎)

JS引擎线程负责解析Javascript脚本,运行代码。

JS引擎一直等待着任务队列中任务的到来,然后加以处理,一个Tab页(renderer进程)中无论什么时候都只有一个JS线程在运行JS程序

同样注意,GUI渲染线程与JS引擎线程是互斥的,所以如果JS执行的时间过长,这样就会造成页面的渲染不连贯,导致页面渲染加载阻塞。

事件触发线程

归属于浏览器而不是JS引擎,用来控制事件循环(可以理解,JS引擎自己都忙不过来,需要浏览器另开线程协助)

当JS引擎执行代码块如setTimeOut时(也可来自浏览器内核的其他线程,如鼠标点击、AJAX异步请求等),会将对应任务添加到事件线程中

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

注意,由于JS的单线程关系,所以这些待处理队列中的事件都得排队等待JS引擎处理(当JS引擎空闲时才会去执行)

定时触发器线程

传说中的setInterval与setTimeout所在线程

浏览器定时计数器并不是由JavaScript引擎计数的,(因为JavaScript引擎是单线程的, 如果处于阻塞线程状态就会影响记计时的准确)

因此通过单独线程来计时并触发定时(计时完毕后,添加到事件队列中,等待JS引擎空闲后执行)

注意,W3C在HTML标准中规定,规定要求setTimeout中低于4ms的时间间隔算为4ms。

异步http请求线程

在XMLHttpRequest在连接后是通过浏览器新开一个线程请求

将检测到状态变更时,如果设置有回调函数,异步线程就产生状态变更事件,将这个回调再放入事件队列中。再由JavaScript引擎执行。

浏览器内核中线程之间的关系

GUI渲染线程与JS引擎线程互斥

因为JS引擎可以修改DOM树,那么如果JS引擎在执行修改了DOM结构的同时,

GUI线程也在渲染页面,那么这样就会导致渲染线程获取的DOM的元素信息可能与JS引擎操作DOM后的结果不一致。

为了防止这种现象,GUI线程与JS线程需要设计为互斥关系,当JS引擎执行的时候,GUI线程需要被冻结,

但是GUI的渲染会被保存在一个队列当中,等待JS引擎空闲的时候执行渲染。由此也可以推出,

如果JS引擎正在进行CPU密集型计算,那么JS引擎将会阻塞,长时间不空闲,导致渲染进程一直不能执行渲染,

页面就会看起来卡顿卡顿的,渲染不连贯,所以,要尽量避免JS执行时间过长。

JS引擎线程与事件触发线程、定时触发器线程、异步HTTP请求线程

事件触发线程、定时触发器线程、异步HTTP请求线程三个线程有一个共同点,那就是使用回调函数的形式,

当满足了特定的条件,这些回调函数会被执行。这些回调函数被浏览器内核理解成事件,在浏览器内核中拥有一个事件队列,

这三个线程当满足了内部特定的条件,会将这些回调函数添加到事件队列中,等待JS引擎空闲执行。例如异步HTTP请求线程,

线程如果检测到请求的状态变更,如果设置有回调函数,回调函数会被添加事件队列中,等待JS引擎空闲了执行。

但是,JS引擎对事件队列(宏任务)与JS引擎内的任务(微任务)执行存在着先后循序,当每执行完一个事件队列的时间,

JS引擎会检测内部是否有未执行的任务,如果有,将会优先执行(微任务)。

(0)

相关推荐

  • Firefox和世界之窗浏览器哪个好

    火狐浏览器 火狐浏览器(Mozilla Firefox)是由Mozilla开发的网页浏览器,采用Gecko网页排版引擎,支持多种操作系统,开放源代码以多许可方式授权,包括Mozilla公共许可证(MP ...

  • 浏览器哪个好 怎么选择浏览器

    大家平时在使用电脑时常常不知道给如何选择浏览器,什么浏览器好用呢?下面小编来告诉你。其实每个主流浏览器都有自己的优点和缺点,最适合自己 的就是最好的浏览器,没有一个绝对满意的浏览器,因为浏览器用户是百 ...

  • WinXP系统里让IE支持多线程下载的设置方法

    随着电脑的普及化和网络速度的提高很多人会进行网上冲浪在网上下载电影来观看,有时我们会同时下载多个文件,为了支持多线程下载通常都会选择专业软件进行下载,因为不少人认为ie浏览器是不支持多线程下载只支持单 ...

  • Firefox和115浏览器哪个好

    火狐浏览器 火狐浏览器(Mozilla Firefox)是由Mozilla开发的网页浏览器,采用Gecko网页排版引擎,支持多种操作系统,开放源代码以多许可方式授权,包括Mozilla公共许可证(MP ...

  • 360安全浏览器-更快的网页下载速度

    360安全浏览器在浏览的各个方面进行优化以提高浏览速度,它比IE等同类浏览器具有更快的下载速度,这需要您自己的使用体验。 从技术上讲,大致有如下几个重要的环节进行了浏览优化: 1、扁平的模块封装,减少 ...

  • 优化Apache,让网站速度更快

    Apache 2.0在性能上的改善最吸引人。在支持POSIX线程的Unix系统上,Apache可以通过不同的MPM运行在一种多进程与多线程相混合的模式下,增强部分配置的可扩充性能。相比于Apache ...

  • HTTP协议Keep-Alive模式详解和HTTP头字段总结

    HTTP协议Keep-Alive模式详解和HTTP头字段总结

  • HTTP Keep-Alive模式是什么?

    HTTP协议中客户端发送一个小请求,服务器响应以所期望的信息(例如一个html文件或一副gif图像).服务器通常在发送回所请求的数据之后就关闭连接.这样客户端读数据时会返回EOF(-1),就知道数据已 ...

  • 软件测试需要学什么 软件测试工程师实训课程

    操作方法 01 软件测试(软件测试培训 )行业一直以来都比较受关注.今天我向读者介绍的是软件测试培训,软件测试需要学什么,如何学习软件测试.软件测试培训课程从软件测试技术基础知识出发,遵循:掌握基础知 ...

  • 什么是多线程和多进程

    线程和进程都是现在电脑概念里比较时髦的用语,什么是多线程,什么是多进程?本文详细的给您介绍一下,希望能增进您对当代电脑技术的了解,有不到之处,还往高手予以更正.进程(英语:Process,中国大陆译作 ...