02 - 从单进程到多进程的浏览器时代
本帖最后由 不二如是 于 2020-2-5 17:33 编辑上一讲(传送门)我们解决了进程和线程的问题。
在小甲鱼老师讲的 Web 系列课程中,总结了三扇传送门(自行阅读,格调满满):
[*]1、Web发展史(传送门)
[*]2、HTML发展史(传送门)
[*]3、CSS发展史(传送门)
本讲重点说下单进程和多进程浏览器的演化。
单进程浏览器时代
顾名思义,单进程浏览器是指:
**** Hidden Message *****
这些模块包含了网络、插件、JavaScript 运行环境、渲染引擎和页面等。
其实早在 2007 年之前,市面上浏览器都是单进程的。
想一想如此多的功能模块运行在一个进程里,会导致什么问题呢?
没错,很多问题~
像单进程浏览器不稳定、不流畅和不安全等等...
简单分析一下产生这些问题的原因。
Q1 不稳定
早期浏览器需要借助于插件来实现诸如 Web 视频、Web 游戏等各种强大的功能。
但是插件是最容易出问题的模块!
而且它还运行在浏览器进程之中。
所以一个插件的意外崩溃会引起整个浏览器的崩溃。
除了插件之外,渲染引擎模块也是不稳定滴~
通常一些复杂的 JavaScript 代码就有可能引起渲染引擎模块的崩溃。
和插件一样,渲染引擎的崩溃也会导致整个浏览器的崩溃。
Q2 格外卡
你们想一想:
所有页面的渲染模块、JavaScript 执行环境以及插件都是运行在同一个线程中。
这就意味着什么呢?
别忘了:同一时刻只能有一个模块可以执行!
随便写个 JavaScript 的脚本:
function dieMy() {
while (1)
{
console.log("die");
}
}dieMy();
千万别在浏览器控制台跑,后果自负{:10_307:}
如果让这个脚本运行在一个单进程浏览器的页面里会发生什么事情呢??
首先脚本本身是无限循环滴~
所以当其执行时,它会独占整个线程。
导致其他运行在该线程中的模块就没有机会被执行。
因为浏览器中所有的页面都运行在该线程中,所以这些页面都没有机会去执行任务。
这样就会导致整个浏览器失去响应,变得异常卡顿。
这块内容要继续往深的地方讲就到页面的事件循环了。
在 JS 系列有科普,有兴趣看:0 2 2 9 ★ 浅谈#JS内存泄漏
具体相关内容放在后面讲~
除了上述脚本或者插件会让单进程浏览器变卡顿外,页面的内存泄漏也是单进程变慢的一个重要原因!
通常浏览器的内核都是非常复杂得。
运行一个复杂点的页面再关闭页面,会存在内存不能完全回收的情况。
导致的问题是使用时间越长,内存占用越高,浏览器会变得越慢。
Q3 安全漏洞
插件可以使用 C/C++ 等代码编写,通过插件可以获取到操作系统的任意资源。
当你在页面运行一个插件时也就意味着:
这个插件能完全操作你的电脑!
如果是个恶意插件,那么它就可以释放病毒、窃取你的账号密码,引发安全性问题。
至于页面脚本,它可以通过浏览器的漏洞来获取系统权限。
这些脚本获取系统权限之后也可以对你的电脑做一些恶意的事情,同样也会引发安全问题。
以上这些都是不可缺少但又不堪回首的过去~
也许鱼油没有经历过,但想象一下:
当你正在用浏览器打开多个页面时,突然某个页面崩溃了或者失去响应,随之而来的是整个浏览器的崩溃或者无响应,随后你给老板写的邮件页面也随消失了。
发现 C 盘里有了 XX 病毒,珍藏的种子也没了...
这时你的心情会不会和页面一样崩溃呢{:10_330:}
多进程的时代
人类最简单的解决问题方式:1 个不够用,那就多个咯~
分成渲染和插件等多个进程。
Chrome 的页面运行在单独的渲染进程中。
页面里的插件也单独运行在插件进程中。
进程之间还是通过 IPC 机制进行通信。
这样会解决上面 3 个问题~
A1 解决不稳定
由于进程是相互隔离的,所以当一个页面或者插件崩溃时。
影响到的仅仅是当前的页面进程或者插件进程。
并不会影响到浏览器和其他页面。
这就完美地解决了页面或者插件的崩溃会导致整个浏览器崩溃,也就是不稳定的问题。
A2 解决不流程
同样,JavaScript 也是运行在渲染进程中的。
即使 JavaScript 阻塞了渲染进程。
影响到的也只是当前的渲染页面,而并不会影响浏览器和其他页面。
因为其他页面的脚本是运行在它们自己的渲染进程中的。
所以当我们再在 Chrome 中运行上面那个死循环的脚本时,没有响应的仅仅是当前的页面。
对于内存泄漏的解决方法那就更简单。
当关闭一个页面时,整个渲染进程也会被关闭。
之后该进程所占用的内存都会被系统回收,这样就轻松解决了浏览器页面的内存泄漏问题。
A3 解决不安全
采用多进程架构的额外好处是可以使用安全沙箱。
可以把沙箱看成是操作系统给进程上了一把锁~
沙箱里面的程序可以运行,但是不能在你的硬盘上写入任何数据。
也不能在敏感位置读取任何数据,例如你的文档和桌面。
Chrome 把插件进程和渲染进程锁在沙箱里面!
这样即使在渲染进程或者插件进程里面执行了恶意程序~
恶意程序也无法突破沙箱去获取系统权限。
下一讲我们聊聊最近很通用的多线程架构
如果有收获,别忘了评分{:10_281:} :
http://xxx.fishc.com/forum/201709/19/094516hku92k2g4kefz8ms.gif
如果想看更多,请订阅 淘专辑(传送门)(不喜欢更要订阅{:10_297:} ) 不错{:10_275:}{:10_275:} zltzlt 发表于 2020-2-5 16:33
不错
写的有点累,但是值得的{:10_278:} 用多线程实现 不二如是 发表于 2020-2-5 16:57
写的有点累,但是值得的
值得 代码我写了,浏览器卡死了{:10_266:}{:10_266:}{:10_266:}
只能退出重进 一个进程的浏览器 单进程浏览器 1 1 个
学习
页:
[1]