浏览器进程和线程
一、Chrome 打开一个页面需要启动多少进程?
Chrome 浏览器采用了多进程架构,以提供更好的性能、稳定性和安全性。在打开一个页面时,Chrome 通常会启动多个进程来处理不同的任务。
在 Chrome 浏览器右上角依次选中【选项】⇒ 【更多工具】 ⇒ 【任务管理器】,就能看到浏览器当前正在运行的进程。
这些进程主要包括:
-
浏览器进程(Browser Process):
1个- 作用:**负责管理浏览器的主要功能。**如用户界面、标签管理、网络请求和文件访问。
- 特点:通常只有一个浏览器进程,即使打开多个标签页也是如此。
-
渲染器进程(Renderer Process)
1~N个- 作用:负责解析和渲染
HTML、CSS、JavaScript等,实现页面的展示和交互。 - 特点:默认情况下,每个标签页(Tab)或单独的Web应用(如Chrome应用)有一个单独的渲染器进程。这样可以提高稳定性,即使一个页面崩溃了,也不会影响其他页面。
- 作用:负责解析和渲染
-
GPU进程(GPU Process)
1个- 作用:处理所有通过 GPU 进行的 3D 绘图和某些 2D 绘图任务,以加速图像处理和渲染。
- 特点:通常只有一个GPU进程,负责所有页面的图形渲染任务。
-
插件进程(Plugin Process)
1~N个- 作用:负责运行浏览器中的插件(如Flash)。
- 特点:每个插件通常有一个单独的进程,确保即使插件崩溃也不会影响整个浏览器。
-
扩展进程(Extension Process)
1~N个- 作用:负责运行浏览器扩展程序。
- 特点:每个扩展程序通常有一个独立的进程,用于确保扩展的稳定性和安全性。
那么,为什么浏览器要启动这么多进程呢?
二、概念切入:了解进程/行程和并行处理
2.1 什么是进程(Process)和线程(Thread)
进程(Process)
进程是计算机操作系统中正在执行的程序实例。每个进程都有独立的内存空间、独立分配系统资源和相互隔离执行环境。操作系统通过进程来管理和分配资源**。**启动一个程序的时候,操作系统会为该程序创建一个内存, 用来存放代码,运行中的数据和一个执行任务的主线程,我们把这样的一个运行环境叫进程。
假设在你的电脑上同时运行以下程序:
浏览器进程
├── 负责渲染网页
├── 负责管理标签页
└── 负责处理用户输入
文本编辑器进程
├── 负责文档打开和编辑
└── 负责保存和加载文件
音乐播放器进程
├── 负责播放音乐
└── 负责音乐库管理
每个程序都是一个独立的进程。即使浏览器崩溃了,文本编辑器和音乐播放器仍然可以正常运行,因为它们是独立的进程。
线程(Thread)
线程是进程中的一个执行流。一个进程可以包含多个线程,一个线程崩溃可能影响整个进程。线程共享父进程的内存空间和资源,多线程可以并发执行,提高程序效率。但可以独立执行。线程是 CPU 调度的基本单位。
假设你在浏览网页的过程中,浏览器使用多线程来提高性能:
浏览器进程
├── 渲染线程(负责绘制页面)
├── 网络线程(负责处理网络请求)
└── 输入线程(负责处理用户输入)
这些线程共享同一个浏览器进程的资源,它们可以并行工作,提高网页加载和交互的速度。
2.2 什么是并行处理(Parallel Processing)
并行处理是指同时执行多个计算任务的过程,以提高处理速度和效率。 可以是多进程并行(不同进程在不同的 CPU 核心上运行)或多线程并行(同一个进程内多个线程同时运行)。
假设你在使用的电脑有四个CPU核心。在处理大型任务时,可以用多进程或多线程的方式并行处理任务:
-
多进程并行处理:
四个独立进程在四个CPU核心上同时运行。
进程A - 核心1 进程B - 核心2 进程C - 核心3 进程D - 核心4 -
多线程并行处理:
一个进程中的四个线程在四个CPU核心上同时运行。
进程A ├── 线程1 - 核心1 ├── 线程2 - 核心2 ├── 线程3 - 核心3 └── 线程4 - 核心4
2.3 线程 VS 进程
多线程可以并行处理任务,但线程不能单独存在,必须由进程启动和管理。
单进程和多进程对比:
-
健壮性:
- 进程:一个进程崩溃通常不会影响其他进程。
- 线程:一个线程崩溃可能导致整个进程崩溃。
-
资源拥有:
- 进程:拥有独立的内存空间和系统资源(如文件描述符、网络连接等)。
- 线程:共享所属进程的资源,包括内存空间和其他系统资源。
-
调度:
- 进程:是系统调度的基本单位,进程切换的开销较大。
- 线程:是CPU调度的基本单位,线程切换的开销相对较小。
-
并发性:
- 进程:进程间可以并发执行,但通信相对复杂。
- 线程:同一进程内的线程之间通信更方便,数据共享和协作更高效。
-
创建和销毁:
- 进程:创建和销毁的系统开销较大。
- 线程:创建和销毁的开销相对较小。
三、浏览器进程架构发展历史
3.1 单进程浏览器时代
单进程浏览器指的是所有功能模块(如网络、插件、JavaScript运行环境、渲染引擎和页面)都在同一进程中运行。早在2007年前,市面上的浏览器几乎都是单进程的。
单进程浏览器的架构
将多种功能模块集中在一个进程中,是导致单进程浏览器不稳定、不流畅和不安全的主要原因。
- 不稳定:早期浏览器依赖插件来实现诸如网页视频和网页游戏等功能,但插件是最易出问题的模块。插件崩溃会导致整个浏览器崩溃。此外,复杂的JavaScript代码也可能导致渲染引擎崩溃。
- 不流畅:所有页面的渲染、JavaScript执行和插件都在同一线程中运行,这意味着同一时刻只能有一个模块可以执行。如果某个脚本进入无限循环,会独占整个线程,导致浏览器卡顿甚至失去响应。页面的内存泄漏也是导致浏览器变慢的重要原因。
- 不安全:如果运行的插件是恶意的,可能会窃取账号密码等敏感信息,带来安全隐患。
3.2 多进程浏览器时代
3.2.1 早期多进程架构
在2008年之前,市面上大部分浏览器,如Internet Explorer、Firefox,都是单进程架构。随着Web应用的复杂性和性能需求的增加,单进程架构的缺陷逐渐暴露,如浏览器崩溃、响应迟缓、安全隐患等。2008年发布的Chrome的多进程架构带来了巨大的变革,通过分离进程提高了浏览器的稳定性、安全性和性能,满足了现代Web应用的需求,为现代浏览器的发展奠定了基础。
2008年Chrome首次发布时的多进程架构采用了浏览器进程、渲染器进程、插件进程和GPU进程的设计,通过进程间通信来协调各个进程间的合作,实现了高稳定性、高性能和高安全性的目标。然而,多进程架构也带来了内存和资源开销的增加以及开发维护复杂度的提升。
尽管如此,多进程架构为现代浏览器树立了新的标准,推动了行业的发展。
3.2.2 最新的多进程架构
最新的 Chrome 进程架构:
最新的Chrome浏览器包含以下主要进程:一个浏览器主进程、一个GPU进程、一个网络进程、多个渲染进程和多个插件进程。
-
浏览器进程:负责界面显示、用户交互、子进程管理和存储等功能。 -
渲染进程:将HTML、CSS和JavaScript转换为用户可交互的网页。排版引擎Blink和JavaScript引擎V8都运行在渲染进程中。Chrome默认为每个标签创建一个渲染进程,且渲染进程在沙箱模式下运行。主线程:处理用户输入、页面渲染和JavaScript执行(包括解析HTML、构建DOM树和CSSOM树、布局和绘制)。当HTML解析遇到**<script>**标签时,会暂停主线程执行JavaScript脚本。JavaScript引擎线程:解析和执行JavaScript代码,采用单线程模型和事件循环机制。由于与主线程互斥,JavaScript执行时间过长可能导致页面渲染不连贯。事件触发线程:处理用户输入、网络请求等事件,将任务加入事件队列,等待JavaScript引擎空闲时处理。定时器触发线程:通过单独的线程处理**setInterval和setTimeout**函数,计时完成后将任务加入事件队列。由于JavaScript单线程特性,定时任务可能无法准时执行。异步HTTP请求线程:处理XMLHttpRequest请求,当状态变更且有回调函数时,将回调函数放入事件队列。合成线程:合成不同渲染层的位图。光栅化线程:将渲染层转换为位图。I/O线程:管理渲染进程与浏览器主进程之间的通信,处理网络资源请求。
-
GPU进程:最初用于3D CSS效果,现用于网页和Chrome UI的图形绘制。 -
网络进程:负责页面的网络资源加载。 -
插件进程:运行浏览器插件,确保插件崩溃不会影响浏览器和其他页面。
因此,打开一个页面至少需要一个网络进程、一个浏览器进程、一个GPU进程和一个渲染进程。如果引入两个插件,则总共有六个进程。
引入多进程模式提高了浏览器的稳定性、流畅性和安全性,但也带来了以下问题:
- 更高的资源占用:每个进程包含公共基础结构的副本(如JavaScript运行环境),消耗更多内存资源。
- 更复杂的体系架构:各模块高度耦合,扩展性差,可能难以适应新的需求。
参考
developer.chrome.com/blog/inside…