【浏览器】浏览器进程简解

如何查看我们的浏览器进程呢?

以我们常用的谷歌浏览器为列,我们可以点击右上角的选项菜单,按照如下图所示操作

image

image

通过上图我们知道浏览器打开了很多进程,包括我们打开的页面,还有一些其他进程(插件、GPU、Nework等),可能你现在想玩什么会打开这么多进程,别着急,看完下面你就知道啦,但首先我们要先了解下进程的概念。

进程和线程

什么是并行处理?

在了解上面进程和线程之前,我们可以先了解下什么是并行处理,在了解并行处理后,进程和线程的关系就更加好理解了。

并行处理(Parallel Processing)是计算机系统中能同时执行两个或多个处理的一种计算方法。并行处理可同时工作于同一程序的不同方面。

举个例子,比如我们要同时下面三个表达式的值,并显示出结果。

A = 1 + 1
B = 10/2
C = 5*3

在编写代码的时候,我们可以把这个过程拆分成四个任务:

  • 任务 1 是计算 A = 1 + 1
  • 任务 2 是计算 B = 10/2
  • 任务 3 是计算 C = 5*3
  • 任务 4 是显示上面最后计算的结果。

如果用单线程处理就是按照顺序四步执行;但是如果采用多线程,那么就只需要两步:第一步,三个线程同时执行前三个计算任务;第二步,显示最后的结果。

单线程四步,多线程(并行处理)只需要两步。因此,使用并行处理能够大幅度提升性能

什么是进程和线程?

多线程可以并行处理任务,但是线程是不能单独存在的,它是由进程来启动和管理的

一个进程就是一个程序的运行实例

详细来说就是启动一个程序时,操作系统会为该程序创建一块内存,这块内存用来存放代码、运行数据和一个执行任务的主线程,上面的这样一个运行环境统叫进程。

可以按照下图来理解:

image

上图可知,线程是依附于进程的,而进程中可以使用多线程并行处理来提升运算效率和性能

总结来说:进程如同一个工厂,它有它独特的资源(系统分配的内存资源)。而线程则就相当于是这个工厂(进程)中的工人,工人(线程)需要在工厂(进程)中工作,并且工人(线程)们共享一个工厂(进程)中的资源(内存资源)。

进程是 CPU 资源分配的最小单位;线程是 CPU 资源调度的最小单位

进程和线程关系

1.进程中的任意一线程执行出错,都会导致整个进程的崩溃。

这个很好理解,工人操作错误,工厂肯定会“崩溃”(笑)。

2.线程之间共享进程中的数据。

如下图所示,线程之间可以对进程的公共数据进行读写操作。

image

线程 1、2、3 分别把结果写入 A、B、C 中,然后线程 2 继续从 A、B、C 中读取数据,从而显示结果。

3.当一个进程关闭之后,操作系统会回收进程所占用的内存。

当一个进程退出时,操作系统会回收该进程所申请的所有资源;即使其中任意线程因为操作不当导致内存泄漏,当进程退出时,这些内存也会被正确回收。

4.进程之间的内容相互隔离。

进程互不干扰,每个进程只能访问自己所占有的资源,这样做的目的是防止某一进程崩溃影响其他进程。但也不是完全隔离,进程之间在特定情况下还是可以进行通信(IPC 机制)

IPC(Inter-Process Communication,进程间通信)。进程间通信是指两个进程的数据之间产生交互。

单进程浏览器

单进程浏览器是指浏览器所有功能模块(网络、插件、JavaScript 运行环境、渲染引擎和页面等)都是运行在同一个进程里。谷歌浏览器发布前浏览器多是单进程的。单进程浏览器架构如下图所示:

image

如图所示,这么多功能模块全部放在一个进程里,肯定会导致很多问题。不稳定、不流程和不安全

  1. 不稳定:插件和渲染引擎会导致整个进程崩溃。

  2. 不流畅:JavaScript 执行环境一旦出现大量计算或者循环就会导致整个进程运行变慢或卡顿。同时内存泄漏也是一大原因。

  3. 不安全:第三方插件可以编写相关调用操作系统底层的恶意代码来获取系统信息;页面脚本可以通过浏览器漏洞获取系统权限造成安全问题。

多进程浏览器

多进程浏览器泛指谷歌浏览器等现代浏览器。

早期多进程架构

下图是 2008 年谷歌发布时的进程架构:

image

从图中我们可以知道,页面、插件都是运行在单独的进程中,进程间的通信通过 IPC 机制进行通信。

1.如何解决不稳定的问题?

由于进程是相互隔离的,所以当一个页面或者插件崩溃时,影响到的仅仅是当前的页面进程或者插件进程,并不会影响到浏览器和其他页面,这就完美地解决了页面或者插件的崩溃会导致整个浏览器崩溃的问题。

2.不流畅的问题是如何解决的?

JavaScript 也是运行在渲染进程中的,所以即使 JavaScript 阻塞了渲染进程,影响到的也只是当前的渲染页面,而并不会影响浏览器和其他页面,因为其他页面的脚本是运行在它们自己的渲染进程中的。所以当我们再在浏览器中运行死循环的代码时,没有响应的仅仅是当前的页面。

3.安全问题是怎么解决的?

采用多进程架构的额外好处是可以使用安全沙箱,你可以把沙箱看成是操作系统给进程上了一把锁,沙箱里面的程序可以运行,但是不能在你的硬盘上写入任何数据,也不能在敏感位置读取任何数据。把插件和渲染进程锁在沙箱里面,即时里面执行了恶意代码,也无法土坯沙箱去获取系统权限。

目前多进程架构

image

按照上图可知最新的谷歌浏览器包括了 5 个进程:

1.浏览器进程

主要负责界面显示、用户交互(如导航栏的前进和后退等);子进程管理(负责各个页面的管理,创建和销毁等其他进程);同时提供存储和处理浏览器底层不可见的操作(如网络请求和文件管理等)等功能。

2.渲染进程

核心任务是将 HTML、CSS 和 JavaScript 转换为用户可以与之交互的网页。

3.GPU 进程

主要用于3D CSS的渲染。

4.插件进程

主要是负责插件的运行,因插件易崩溃,所以需要通过插件进程来隔离,以保证插件进程崩溃不会对浏览器和页面造成影响。

所有,打开一个页面至少要有 4 个进程(网络进程、浏览器进程、GPU 进程、渲染进程),如果还有插件,还得加上一个插件进程,回到最开始的截图,可以明白为什么有那么多进程了吧。

多进程模型的缺点

1.更高的资源占用

因为每个进程都会包含公共基础结构的副本(如 JavaScript 运行环境),这就意味着浏览器会消耗更多的内存资源。

2.更复杂的体系架构

浏览器各模块之间耦合性高、扩展性差等问题,会导致现在的架构已经很难适应新的需求了。

未来面向服务的架构

为了解决这些问题,在 2016 年,Chrome 官方团队使用“面向服务的架构”(Services Oriented Architecture,简称SOA)的思想设计了新的 Chrome 架构。也就是说 Chrome 整体架构会朝向现代操作系统所采用的“面向服务的架构” 方向发展,原来的各种模块会被重构成独立的服务(Service),每个服务(Service)都可以在独立的进程中运行,访问服务(Service)必须使用定义好的接口,通过 IPC 来通信,从而构建一个更内聚、松耦合、易于维护和扩展的系统,更好实现 Chrome 简单、稳定、高速、安全的目标。

Chrome 最终要把 UI、数据库、文件、设备、网络等模块重构为基础服务,类似操作系统底层服务,下面是 Chrome “面向服务的架构”的进程模型图:

image

总结

最初的浏览器是单线程的(不稳定、不流畅、不安全),直到谷歌浏览器的出现,创造性的引入了多进程架构,解决了上面的问题(谷歌浏览器,YYDS!)。

目为了应用更多业务场景,Chrome 浏览器架构体系变得越来越复杂。从三个进程(插件、渲染、浏览器主进程)变到五个进程(插件、渲染、网络、浏览器主进程、GPU),业务的发展倒逼 Chrome 的发展,未来的发展则是“面向服务的架构”(Services Oriented Architecture,简称SOA)的思想架构(渲染、插件、浏览器主进程、Chrome 基础服务),但距离我们还远,目前掌握最新的五进程就行。

参考文章

浏览器工作原理与实践

posted @ 2022-06-15 23:41  努力挣钱的小鑫  阅读(510)  评论(0编辑  收藏  举报