3. 当一个进程关闭之后,操作系统会回收进程所占用的内存 。
当一个进程退出时,操作系统会回收该进程所申请的所有资源;即使其中任意线程因为操作不当导致内存泄漏,当进程退出时,这些内存也会被正确回收 。
比如之前的 IE 浏览器,支持很多插件,而这些插件很容易导致内存泄漏,这意味着只要浏览器开着,内存占用就有可能会越来越多,但是当关闭浏览器进程时,这些内存就都会被系统回收掉 。
4. 进程之间的内容相互隔离 。
进程隔离是为保护操作系统中进程互不干扰的技术,每一个进程只能访问自己占有的数据,也就避免出现进程 A 写入数据到进程 B 的情况 。正是因为进程之间的数据是严格隔离的,所以一个进程如果崩溃了,或者挂起了,是不会影响到其他进程的 。如果进程之间需要进行数据的通信,这时候,就需要使用用于进程间通信(IPC)的机制了 。
单进程浏览器时代在了解了进程和线程之后,我们再来一起看下单进程浏览器的架构 。顾名思义,单进程浏览器是指浏览器的所有功能模块都是运行在同一个进程里,这些模块包含了网络、插件、JavaScript 运行环境、渲染引擎和页面等 。其实早在 2007 年之前,市面上浏览器都是单进程的 。单进程浏览器的架构如下图所示:
文章插图
单进程浏览器架构示意图
如此多的功能模块运行在一个进程里,是导致单进程浏览器不稳定、不流畅和不安全的一个主要因素 。下面我就来一一分析下出现这些问题的原因 。
问题 1:不稳定早期浏览器需要借助于插件来实现诸如 Web 视频、Web 游戏等各种强大的功能,但是插件是最容易出问题的模块,并且还运行在浏览器进程之中,所以一个插件的意外崩溃会引起整个浏览器的崩溃 。
除了插件之外,渲染引擎模块也是不稳定的,通常一些复杂的 JavaScript 代码就有可能引起渲染引擎模块的崩溃 。和插件一样,渲染引擎的崩溃也会导致整个浏览器的崩溃 。
问题 2:不流畅从上面的“单进程浏览器架构示意图”可以看出,所有页面的渲染模块、JavaScript 执行环境以及插件都是运行在同一个线程中的,这就意味着同一时刻只能有一个模块可以执行 。
比如,下面这个无限循环的脚本:
function freeze() { while (1) {console.log("freeze"); }}freeze();?复制代码
如果让这个脚本运行在一个单进程浏览器的页面里,你感觉会发生什么?因为这个脚本是无限循环的,所以当其执行时,它会独占整个线程,这样导致其他运行在该线程中的模块就没有机会被执行 。因为浏览器中所有的页面都运行在该线程中,所以这些页面都没有机会去执行任务,这样就会导致整个浏览器失去响应,变卡顿 。这块内容要继续往深的地方讲就到页面的事件循环系统了,具体相关内容我会在后面的模块中为你深入讲解 。
除了上述脚本或者插件会让单进程浏览器变卡顿外,页面的内存泄漏也是单进程变慢的一个重要原因 。通常浏览器的内核都是非常复杂的,运行一个复杂点的页面再关闭页面,会存在内存不能完全回收的情况,这样导致的问题是使用时间越长,内存占用越高,浏览器会变得越慢 。
问题 3:不安全这里依然可以从插件和页面脚本两个方面来解释该原因 。
插件可以使用 C/C++ 等代码编写,通过插件可以获取到操作系统的任意资源,当你在页面运行一个插件时也就意味着这个插件能完全操作你的电脑 。如果是个恶意插件,那么它就可以释放病毒、窃取你的账号密码,引发安全性问题 。
至于页面脚本,它可以通过浏览器的漏洞来获取系统权限,这些脚本获取系统权限之后也可以对你的电脑做一些恶意的事情,同样也会引发安全问题 。
以上这些就是当时浏览器的特点,不稳定,不流畅,而且不安全 。这是一段不堪回首的过去,也许你没有经历过,不过你可以想象一下这样的场景:当你正在用浏览器打开多个页面时,突然某个页面崩溃了或者失去响应,随之而来的是整个浏览器的崩溃或者无响应,然后你发现你给老板写的邮件页面也随之消失了,这时你的心情会不会和页面一样崩溃呢?
多进程浏览器时代好在现代浏览器已经解决了这些问题,是如何解决的呢?这就得聊聊我们这个“多进程浏览器时代”了 。
早期多进程架构你可以先看看下面这张图,这是 2008 年 Chrome 发布时的进程架构 。
推荐阅读
- 花椒基于 Go 语言的敏感词系统架构讲解
- 2020年你需要的七个最佳Google Chrome插件扩展
- 基于Linux系统的高可用中小型网站集群架构说明
- 带你去看美团架构
- 年薪80W的架构师总结:性能优化其实不难,记住这十条策略就够了
- Chrome 实用插件推荐
- 分布式架构的总结
- 20个MySQL高性能架构设计原则
- 刮痧是什么意思
- 华为|支持X86、Arm等六大架构!华为:欧拉累计装机量超130万套