从 chrome 浏览器说说进行与线程

在正式开始讲进程和线程之前首先需要理解的一个概念就是并行处理,因为当你理解了并行处理之后,你对进程和线程的理解就会轻松很多。

什么是并行处理

从字面意思就可以理解,并行处理的意思就是,同一时刻处理多个任务。比如我们要计算下面两个表达式的值:

A = 1 + 2
B = 2 + 3

从代码编译的角度这个过程可以被拆分为三部分:

  • 第一步:计算 A = 1 +2
  • 第二步:计算 B = 2 + 3
  • 第三步:显示最后的计算结果

如果我们使用单线程来处理,浏览器就会按照我上面的步骤分3步来执行。

如果采用多线程最后的结果会是怎样的呢?

多线程只需要分两步来进行处理:

  • 第一步:使用两个线程同时执行前面的两个任务
  • 第二步:输出结果

到底什么是进程?

首先需要明确的一个概念是,线程是不可以单独存在的,线程是依赖于进程而存在的而。

那什么是进程呢?

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

官方的解释是,启动一个程序的时候,操作系统会为该程序创建一块内存,用来存放代码、运行中的数据和一个执行任务的主线程,我们把这样一个运行环境叫做进程。

进程和线程之间的关系

进程中的任何一个线程执行出错,都会导致整个进程奔溃

举一个例子:

A = 1 * 0
B = 2 / 0

当上面的程序在计算 B 的时候,由于分母为 0 ,会导致执行出错,因为线程执行出错会导致整个进程的崩溃,进程一旦崩溃,其他线程的执行也就没有结果了。

线程之间共享进程中的数据

线程之间可以对进程中的公共数据进行操作。

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

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

进程之间的内容相互隔离

进程隔离是为了保护操作系统中各自的进程互不干扰,每一个进程只能访问自己所占有的数据,这样就避免了进程A写入数据到进程B的情况出现。

同时,也正因为进程之间的数据是相互隔离的,所以当一个进程崩溃了或者是挂起了,是不会影响到其他的进程的。

但是进程之间也不是绝对的隔离,如果进程之间需要数据的通信,这个时候,就需要使用进程间通信(IPC) 的机制了。

浏览器的多进程架构

最新的 Chrome 浏览器包括:1个浏览器主进程、1个GPU进程、1个网络进程、多个渲染进程和多个插件进程。

下面我们来说说这几个进程的主要功能:

  • 浏览器进程。主要负责页面显示、用户交互、子进程管理,同时提供存储等功能。
  • 渲染进程。核心任务是将HTML、CSS 和 JavaScript 转换为用户可以与之交互的网页,排版引擎 Blink 和 V8 引擎都是运行在这个进程中,默认情况下,Chrome 会为每个 Tab 标签创建一个渲染进程。同时,处于安全考虑,渲染进程都是运行在沙箱模式下。
  • GPU 进程。Chrome 在刚开发发布的时候是没有 GPU 进程的。而 GPU 的使用初衷是为了实现 3D CSS 效果,只是随后网页、Chrome 的 UI 界面都选择采用 GPU 来绘制,这使得 GPU 称为浏览器普遍的需求。最后,Chrome 在其多进程架构之上也引入了 GPU 进程。
  • 网络进程。主要负责页面的网络资源加载,之前是作为一个模块运行在浏览器进程里面的,直至最近才独立出来,成为一个单独的进程。
  • 插件进程。主要是负责插件的运行,因为插件容易崩溃,所以需要通过插件进程来隔离,以保证进程崩溃不会对浏览器和页面造成影响。

浏览器的多进程架构带来的问题

虽然多进程模型提高了浏览器的稳定性、流畅性和安全性,但同样布不可避免的带来了一些问题:

  • 更高的资源占用。因为每个进程都会包含公共基础结构的副本(如 JavaScript 的运行环境),这就意味着浏览器会消耗更多的内存资源。
  • 更复杂的体系结构。浏览器各模块之间的耦合性高、扩展性差等问题,会导致现在的架构已经很难适应需求了。

面向未来的服务架构

为了解决目前的浏览器架构所带来的问题,在2016年,Chrome 官方团队使用”面向服务的架构“的思想设计了新的 Chrome 架构。

也就是说 Chrome 整体架构会朝向现代操作系统所采用的”面向服务的架构“方向发展,原来的各种模块会被重构成独立的服务,每个服务都可以在独立的进程中运行,访问服务必须使用定义好的接口,通过 IPC 来通信,从而构建一个更内聚、松耦合、易于维护和扩展的系统,更好的实现 Chrome 简单、稳定、高速、安全的目标。

相关推荐