为什么打开一个页面,浏览器会有4个进程或更多?
首先说一下单进程浏览器
2007年之前,市面上的浏览器都是单进程的,即所有页面中所有的模块都运行在一个进程里,这些模块包括:网络、插件、javascript运行环境、渲染引擎、页面展现等。
这么多模块都运行在一个进程中,是浏览器不稳定、不流畅和不安全的主要因素。
1.不稳定
早期浏览器需要借助插件来实现web视频、web游戏等强大功能。但是插件是及其不稳定的因素,当插件崩溃时,会导致整个浏览器的崩溃,因为插件作为一个模块与其他模块都共同运行在浏览器进程中。
除去插件模块外,渲染引擎模块也是不稳定的,一些复杂的javascript代码会是渲染引擎模块崩溃,导致浏览器崩溃
2.不流畅
所有页面的渲染模块、javascript执行环境以及插件都运行在同一线程中,这就意味着同一时刻只能有一个模块可以执行。
如果有一个无限循环的脚本运行在一个单进程的浏览器的页面里是,它会占据整个线程,这会导致运行在该线程中的其它模块,都没有机会被执行。因为浏览器中所有的页面都运行在此线程中,所以这些页面没有机会被执行,这样就会导致整个浏览器失去响应,变卡顿。
页面的内存泄漏也会直接导致单进程变慢。运行复杂页面时,部分内存不能完全被回收,这样导致使用时间越长,内存占用越高,浏览器就会变的越慢。
3.不安全
插件可以使用C/C++等代码编写,通过插件可以获取到操作系统的任何资源,当运行一个插件时,这个插件能完全操作你的电脑,如果是恶意插件的话,它可以在你的电脑上释放病毒或盗窃你的账号密码等。
页面脚本可以通过浏览器漏洞获得你的系统权限,恶意的脚本可以通过获取到的权限,对你的电脑做一些恶意的事情。
多进程浏览器时代
(chrome进程架构图)
从图中可以看出,现在的chrome浏览器包括:一个浏览器主进程、多个渲染进程、多个插件进程、网络进程、1个GPU进程。
1.浏览器进程:主要负责界面显示、用户交互、子进程管理、提供存储功能等功能
2.渲染进程:将HTML、CSS、Javascript转换为用户可以交互的界面,默认情况下,chrome会为每个Tab标签提供一个渲染进程,渲染进程是运行在沙箱模式下
3.GPU进程:chrome的UI界面都选择使用GPU来绘制
4.网络进程:负责页面的网络资源加载
5.插件进程:负责插件的运行,因为插件的易崩溃,所以需要通过插件进程来隔离,已保证插件崩溃时,不会影响浏览器以及其他页面资源
(如果是同一站点,从A页面点到B页面,此时,两个页面同用一个渲染进程,如果两个页面的站点不同,会是两个渲染进程,如果页面中有iframe,iframe也会自己占用一个进程)