浏览器仅打开一个页面,却有多个进程?

725 阅读7分钟

截屏2022-05-07 下午1.34.26.png

如图所示,当浏览器开启一个页面的时候,会有多个进程出现,那么是为什么明明只开启了一个页面却会有多个进程出现呢? 想了解这其中的原因,首先了解一下进程和线程的概念

进程和线程

进程的概念,借一个例子来叙述一下, 例如,在处理一个需求,需要计算如下三个值的结果,并且显示的时候

截屏2022-05-07 下午2.16.28.png 有两种情况,一种如果是考虑单线程的情况,那么就是这个就可以分为四个任务,按顺序一次执行三个计算,最后显示计算的结果

如果是考虑多线程的情况,那么就是可以是分配三个独立的线程同时计算算个计算结果,之后执行显示的结果。

由此我们可以发现,单线程事实上需要四步,分别运算三个结果最后在显示,而多线程实际只需要两步,三个运算同时运行之后显示,因此,多线程的情况效率是远远高于单线程情况的。

借此,我们知道了线程的概念,以及单、多线程的概念,但是还有很重要的一点,线程是不能够独立存在的,他是由进程来管理的。

其中进程,指的就是一个在内存之中运行的应用程序,比如开启浏览器,就是开启了一个进程,每个进程都有独立的内存空间,并且,一个进程可以有多个线程,但是至少包括一个线程

下面引用一张图片来清楚的表明上述,单、多线程的计算过程,可以明显比较出多线程的效率是较高的

截屏2022-05-07 下午2.09.37.png

而关于线程和进程的关系,主要有以下几点

1.进程的任一程序出错、崩溃,都会导致整个进程阻塞、崩溃 例如,上述程序将20 / 5,改为20 / 0 的话,分母变成0,线程会出错,那么进程也会随之出错。

2.线程之间的数据可以共享 关于共享数据,引用下图讲述的很清晰

截屏2022-05-07 下午2.25.07.png 线程2中的任务4度图线程1、3写入a、c的数据,并显示出来,由此可见,线程之间的数据是可以共享的

3.当一个进程关闭之后,系统会回收他所占的内存,即使是操作不当所造成的内存泄漏,也会回收。

4.进程之间的数据是相互隔离的 我的理解是进程值得数据相互隔离是类似闭包的概念的?每个进程之间的数据互不干扰,因此如果某个进程崩溃了,并不会影响其他进程。如果需要进程之间相互通信,需要用到进程间的通信机制(IPC)

单进程浏览器

了解完进程和线程的概念后,我们下面了解一下单进程浏览器

引用下图来表示单进程程浏览器的原理

截屏2022-05-07 下午2.36.55.png 通过名字我们就可以知道,单进程浏览器的意思就是所有的内容包括页面渲染、展现、js执行、插件等都是运行在一个进程的。这就会导致许多的问题,

1.不稳定

早期的许多功能比如web视频等都需要插件来协助完成,而插件是很容易出现问题的,当插件一旦出现问题,崩溃,由于单进程的原因,就会出现整个浏览器都会一起崩溃的情况。

2.不流畅

由于所有页面的js代码执行也都是在一个进程里面,如果js代码中出现一个死循环,那么,我们知道单进程是一个程序执行完成后才会执行下面的,如果出现死循环,那么就永远都无法继续向下执行,会导致其他页面无法展示、浏览器卡顿、崩溃。

还有页面的内存泄露也是浏览器卡顿的一大原因,通常情况下,浏览器内核都是十分复杂的,如果运行一个复杂的页面后在关闭,可能会出现内存没有完全回收的情况,长期累积,可能会导致浏览器的卡顿。

3.不安全

恶意脚本,可以利用浏览器漏洞来获取系统的权限,获取到权限之后,可能就会对你的电脑造成伤害,而通过编写恶意插件等,如果你在页面运行了这个插件,那么就可能获取你用户信息等,从而引发安全问题

多进程浏览器

通过上述内容,我们发现了单进程浏览器存在的问题,好在,但是多进程浏览器的出现,解决了这些问题 ,引用一张图,介绍目前的多进程浏览器

截屏2022-05-07 下午2.53.50.png

从图中我们就可以发现,与单进程浏览器不同,多进程浏览器将不同的功能通过不同的进程来完成,而不是所有的功能都在一个进程中完成。

其中包括

浏览器主进程(Browser Process):主要负责页面的展示、用户的交互、子进程的管理等

渲染进程(Render Process):将html、css、js转换为用户可交互的页面,还有排版引擎blink和js引擎v8都在该进程中运行,默认情况下,chrome会为每一个tab标签都创建一个渲染进程。另外为了安全,渲染进程都是在沙箱模式下进行的。

GPU进程(GPU Process):chrome刚开始发布的时候,并没有GPU进程,但是之后的网页、chrome的ui界面等都采取GPU绘制、使得GPU成为浏览器的普遍需求,因此,GPU进程被chrome的多进程架构引入。

网络进程(NetWork Process):负责页面的网络资源加载

插件进程(Plugin Process):负责插件的运行,由于插件易崩溃,所以用一个独立的进程运行插件,防止插件崩溃导致整个浏览器都崩溃。

我们在关注关注一下,多进程浏览器是如何解决单进程浏览器出现的问题的:

在稳定性方面,由于是多进程,不同的进程间相互隔离,所以当某一个进程崩溃的时候,并不户影响其他页面,只会是当前页面的崩毁。

在流畅性问题上,由于js代码是执行在渲染进程中的,因此即使js代码陷入死循环,阻塞的也只是自己页面的渲染进程,其他的页面并不会收到影响,因为其他页面是运行在他们各自的渲染进程中的,相互独立, 关于内存泄露的问题,在一个页面关闭后,整个渲染进程就会关闭,浏览器就会回收该进程所占用的内存,从而解决了内存泄露堆积的问题。

安全性上,多进程浏览器采用沙箱模式,沙箱里面的程序可以运行,但是不能在硬盘写入数据,也不能读取用户的敏感信息,chrome将插件或者脚本放入沙箱中,即使是恶意脚本和插件,他们也并不能突破沙箱取获取或者修改信息。

至此,我们就知道了,为什么打开一个浏览器页面,会出现多个进程,因为打开一个浏览器,至少需要一个浏览器住进程、GPU进程,渲染进程和网络进程

但是,多进程虽然解决了许多的问题,同时也带来了问题:

更高的资源占用:许多进程之间都包含公共的基础结构副本,如js的运行环境,这就会导致浏览器消耗更多资源。

更复杂的体系结构:浏览器各个模块间的耦合性高、扩展性差,很难适应更家复杂的体系结构了。