浏览器工作原理与实践(一)

 Chrom架构:仅仅打开1个页面,为什么有4个进程?

  无论你是想要设计高能web应用,还是要优化现有的 Web 应用,你都需要了解浏览器中的网络进程、页面渲染过程,JavaScript执行流程,以及 Web 安全理论,而这些功能是分散在浏览器的各个功能组件中的,通过浏览器的多  进程架构的学习,就可以把这些分散的知识点串联起来,本章内容基于Chrome浏览器。

  在开始之前,我们先看一下,Chrome 打开一个页面需要启动多少进程?打开 Chrome浏览器 任务管理器的窗口,如下图:

   

  从图中可以看到,Chrome启动了4个进程,你也许会好奇,启动了一个页面,为什么启动这么多进程呢?

  在解答这个问题之前,我们需要了解一下进程的概念,不过由于好多人容易把进程和线程的概念混淆,从而影响后续其他概念的理解,所以在这里先讲解一下这两个概念

  进程和线程

  在介绍进程和线程之前,我需要先讲解下什么是并行处理,因为理解了并行处理的概念,再理解进程和线程会轻松许多。

  什么是并行处理?

   计算机中的并行处理就是同意时刻处理多个任务,比如我们要计算下面三个表达式的值,并显示出结果。

A = 1+2
B = 20/5
C = 7*9

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

  • 任务1是计算 A=1+2
  • 任务2是计算20/5
  • 任务3是计算C=7*8
  • 任务4是显示最后计算的结果

 正常情况下程序可以使用单线程来处理,也就是分四步按照顺序分别执行四个任务。

 如果采用多线程,我们只需分“两步”,

  •  第一步:使用三个线程同时执行前三个任务
  •  第二步:再执行第四个显示任务

通过对比,你会发现用单线程执行需要四部,而使用多线程只需要两步。因此使用多进程处理能大大提升性能

线程VS进程

多线程可以并行处理任务,但是线程是不能单独存在的,它是由进程来启动和管理的。那么什么优势进程呢?

一个进程就是一个程序的运行实例。详细解释就是,启动一个程序的时候,操作系统会为该程序创建一块内存,用来存放代码、运行中的数据和一个执行任务的主线程,我们把这这样一个运行环境叫线程,线程是依附于进程的,而进程中使用多线程并行处理能提升运算效率。

 总结来说,进程和线程有以下4个特点

  •  进程中的任意一线程出错,就会导致整个进程的崩溃。
  •  线程之间共享进程中的数据,线程之间可以对进程读写与操作
  •  当一个进程关闭后,操作系统会回收进程所占用的内存,当一个进程退出时,操作系统会回收该进程所申请的所有资源
  •  进程之间的内容相互隔离,进程隔离是为保护操作系统中进程互不干扰的技术,每一个进程只能访问自己占有的数据,正因进程是隔离的饿,所以一个进程如果崩溃了,是不会影响其他进程的,如果进程之间需要通信,就需要使用用于进程间通信(IPC)的机制

 单进程浏览器时代

 单进程浏览器是指浏览器的所有功能模块都是运行在同一个进程里,包含了 网络、插件、JavaScript运行环境、渲染引擎和页面等。 

早在2007年之前,市面上浏览器都是单进程的 

 如下次多的功能模块运行在一个进程里,是导致单进程浏览器不稳定、不流畅和不安全的一个主要因素

  •  不稳定:早期浏览器借助插件来实现web视频、web游戏等各种强大的功能,插件最容易出现问题的模块,一个插件意外崩溃会引起整个浏览器的崩溃,除插件之外,渲染引擎也不稳定,通常复杂的js代码有可能引起渲染引擎模块的崩溃,也会导致整个浏览器的崩溃。
  •  不流畅:从上图可以看出所有的渲染模块、JS执行环境以及插件都运行在一个线程,意味着同一时刻只能有一个模块可以执行,假如有个无限循环的脚本 while(true){console.log('log')},因为这个脚本是无限循环的,所以当其执行时,会独占整个线程,因为浏览器重所有页面都在该线程,所以这些页面没有机会执行任务,就会导致整个浏览器失去响应卡顿,除了脚本和插件会让单进程变得卡顿,页面的内存泄漏也是一个重要原因。通常内存的浏览器的内核是非常复杂的,运行一个复杂的页面在关闭会存在内存不能完全回收,这样导致的问题使用时间越长,内存占用越高,浏览器越慢
  •  不安全:插件可以使用C/C++等代码编写,通过插件可以获取操作系统任意资源,如果是个恶意插件就可以释放病毒,引发安全性问题;页面脚本可以通过浏览器获取系统权限也可以对你的电脑做恶意的事情,引发安全问题。

 多进程浏览器时代

 现代浏览器已经解决了这些问题

 2008年 Chrome 发布时的进程架构

 

 从图中可以看出,Chrome 的页面是运行在单独的渲染进程中的,同时页面里的插件也是运行在单独的插件进程之中,进程间通过 IPC 机制进行通信

 先看看如何解决不稳定的问题。

  •  解决不稳定:由于进程是隔离的,所以一个页面或者插件崩溃,影响到的仅仅是当前的页面进程或者插件进程,并不会影响到其他浏览器和页面
  •  解决不流畅:Js也是运行在渲染进程中的,所以即使Js阻塞了渲染进程,影响到的也只是 当前的渲染页面,因为其他的页面脚本运行在他们自己的渲染进行中
  •  解决不安全:采用多进程架构的额外好处是可以使用安全沙箱,你可以把沙箱看成是操作系统给进程上了一把锁,沙箱里面的程序是可以运行,但是不能在你的硬盘上写入任何数据,也不能在敏感位置读取任何数据,例如文档和桌面,Chrome把插件和渲染进程锁在安全沙箱,这样即使执行了恶意程序,也无法突破沙箱获取系统权限

目前多进程架构

看看最新的Chrome进程架构

从图中可以看出,最新的 Chrome 浏览器包括: 1个浏览器(主进程)、一个GPU进程、一个网络进程(NetWork)、多个渲染进程和多个插件进程

 下面逐渐分析几个进程的功能

  •  浏览器进程:主要负责界面显示、用户交互、子进程管理,同时提供存储等功能
  •  渲染进程:核心任务是将 HTML、CSS、JS转换为用户可以与之交互的网页,排版引擎Blink 和 JS引擎 V8 都是运行在该进程,默认情况 Chrome 会为每个Tab创建一个渲染引擎
  •  GPU进程:Chrome刚开始发布是没有GPU进程的,而GPU使用初衷是为了实现3D CSS的效果,随后网页、Chrome的UI界面都选择采用GPU来绘制
  •  网络进程:负责网络资源的加载,之前作为模块运行在浏览器进程,现在独立一个单独的进程
  •  插件进程:主要是负责插件的运行,因为插件易崩溃,所以通过插件进程来隔离,以保证插件进程不会对浏览器造成影响。

 讲到这里,现在你应该可以回答文章开头提到的问题,打开一个页面为什么会有四个进程了。

 不过凡事都有两面性,看看带来的弊 吧:

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

在 PDFlux 中打开
无数据
原文地址:https://www.cnblogs.com/cuixiaohua/p/12761305.html