本文中所有的讨论都基于目前使用率最高的 Chrome 浏览器。你可以点击 Chrome 浏览器右上角(选项/更多工具/任务管理器)打开 Chrome 的任务管理器的窗口。
浏览器开启了多进程,通过并行处理能够大大提升性能。
进程(Process)& 线程(Thread)
一个进程就是一个程序的运行实例,用来存放代码、运行中的数据、执行任务的内存,这样的一个环境就叫做进程。每个进程至少有一个线程,线程不能单独存在,由进程来启动和管理。多线程可以并行处理任务,大大提升工作效率。
!https://s3-us-west-2.amazonaws.com/secure.notion-static.com/f58e4c92-9916-4b06-ae52-8750f1d42095/Untitled.png
进程和线程的关系如下:
- 进程中的任意线程执行出错都会导致整个进程奔溃。
- 线程之间共享进程中的数据。
- 一个进程关闭之后,操作系统会回收掉进程所占用的内存。
- 进程之间相互隔离,一个进程奔溃了,不会影响到其他的进程,如果进程之间需要相互通信,就需要使用基于进程间通信(IPC)机制了。
!https://s3-us-west-2.amazonaws.com/secure.notion-static.com/889a8850-669a-4b0e-9c6d-911583a74379/Untitled.png
单进程浏览器时代
单进程浏览器是指浏览器所有的功能模块都运行在同一个进程里。包括网络、插件、JS 运行环境、渲染引擎和页面等。如此多的功能模块几种在一个进程里,是导致进程不稳定、不流畅、不安全的主要因素。
!https://s3-us-west-2.amazonaws.com/secure.notion-static.com/ccdf558c-f933-47d2-af6d-45ccd2e9138e/Untitled.png
目前浏览器多进程架构
目前多进程包括:一个浏览器主进程、一个 GPU 进程,一个网络进程,多个渲染进程和多个插件进程。
!https://s3-us-west-2.amazonaws.com/secure.notion-static.com/71bc968b-2719-4d06-bac7-9f3d0d696faa/Untitled.png
- 浏览器进程:负责界面显示,用户交互,子进程管理,同时提供存储等功能。
- 渲染进程:将 HTML、CSS、JS 转换为用户可以与之交互的网页,排版引擎 Blink 和 V8 引擎都运行在该进程中。默认每个 tab 一个渲染进程。出于安全考虑,渲染进程都是运行在沙箱模式下。
- GPU 进程:后面随着需求,GPU 进程被引入用来绘制界面。
- 网络进程:主要负责网页的网络资源加载。
- 插件进程:负责查件的运行。以保证插的奔溃不会对网页造成影响。
虽然多进程模型提升了浏览器的稳定性、流畅性和安全性,但是带来了一些问题:
- 更高的资源占用:每个进程都包含 JS 运行环境,消耗更多的内存资源。
- 更复杂的体系架构:模块之间耦合性高、扩展性差。