XiZev / blog

record my learning of font-end
0 stars 0 forks source link

Chrome架构 #12

Open XiZev opened 3 years ago

XiZev commented 3 years ago

仅仅打开了1个页面,为什么有4个进程?

XiZev commented 3 years ago

Q:Chrome浏览器打开页面一共启动多少个进程?

A:Chrome任务管理器可以用来用来展示运行中Chrome使用的进程信息的 包括浏览器进程、GPU进程、插件进程、网络进程

QQ截图20210825121950

XiZev commented 3 years ago

Q:单线程 VS 多线程

A:在同一时刻,单线程指的是只有一个任务正在执行,前一个任务没有执行完毕的情况下,后一个任务无法开始,而多线程指的是多个任务并行处理,多个任务的执行互不干涉。

QQ截图20210825125532

XiZev commented 3 years ago

Q:线程 VS 进程

A:线程是不能单独存在的,它是由进程来启动和管理的。

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

QQ截图20210825142114

进程和线程之间的关系有以下4个特点:

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

  2. 线程之间共享进程中的数据。 QQ截图20210825142455

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

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

XiZev commented 3 years ago

Q:单进程浏览器

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

这就导致了单进程浏览器不稳定、不流畅和不安全。

插件模块和渲染引擎模块,容易出问题,并且还运行在浏览器进程之中,所以一个插件的意外崩溃会引起整个浏览器的崩溃。

所有页面的渲染模块、JavaScript执行环境以及插件都是运行在同一个线程中的,这就意味着同一时刻只能有一个模块可以执行。除此之外,页面的内存泄漏也是单进程变慢的一个重要原因。通常浏览器的内核都是非常复杂的,运行一个复杂点的页面再关闭页面,会存在内存不能完全回收的情况,这样导致的问题是使用时间越长,内存占用越高,浏览器会变得越慢

这里依然可以从插件和页面脚本两个方面来解释该原因。 插件可以使用C/C++等代码编写,通过插件可以获取到操作系统的任意资源,当你在页面运行一个插件时也就意味着这个插件能完全操作你的电脑。如果是个恶意插件,那么它就可以释放病毒、窃取你的账号密码,引发安全性问题。 至于页面脚本,它可以通过浏览器的漏洞来获取系统权限,这些脚本获取系统权限之后也可以对你的电脑做一些恶意的事情,同样也会引发安全问题。

XiZev commented 3 years ago

Q:多进程浏览器 — 解决单进程带来的问题 QQ截图20210825145141

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

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

因此打开1个页面至少需要1个网络进程、1个浏览器进程、1个GPU进程以及1个渲染进程,共4个;如果打开的页面有运行插件的话,还需要再加上1个插件进程