浏览器是多进程的,当打开多个tab页面的时候在任务管理器中可以发现有多个浏览器进程正在运行,并且占用了很大的内存。为什么浏览器需要使用多进程呢,其实也有一些的单进程浏览器譬如火狐世界之窗(可以设置为单进程或者多进程)等等。
单进程浏览器的时代:
单进程浏览器就是将浏览器所有功能模块都是运行在同一个进程中
单进程浏览器带来的问题:
不稳定性:一旦插件,渲染引擎等等任何一个模块出现了问题,都会引起浏览器的崩溃
不流畅:同一时间只有一个模块可以运行
不安全:插件和脚本中容易存在恶意软件,进而控制自己的电脑
多进程浏览器的时代:
现在浏览器基本都是多进程浏览器
多进程的架构图
如上图浏览器的进程可分为
Browser进程
GPU进程
第三方插件进程
render进程
Browser进程:
该进程是浏览器的主进程,有且只有一个。它的功能有:
负责管理页面,创建和销毁其他的进程
管理网络资源,下载
负责浏览器页面的显示和交互
GPU渲染进程:
该进程最多只有一个,用于页面上3D的绘制。这个进程在早期是没有的,但是为了实现3D CSS的效果,所以引入这个GPU渲染进程
第三方插件进程:
主要负责浏览器插件的运行,每当运行一个插件的时候就会创建一个该进程,能够做到隔离插件的作用避免如果插件崩溃时影响到浏览器以及页面
render进程:
浏览器渲染进程,也就是浏览器内核,内部存在多个线程,默认情况下每个页面都是一个进程互不影响,主要功能是渲染页面,网络请求,执行脚本,事件处理等等。
至于render进程中的线程也需要进行介绍一下:
GUI渲染线程:
主要负责页面的渲染,解析HTML,CSS,构建DOM树,布局绘制等
当界面引发重绘或者回流的时候,也会执行GUI渲染线程进行页面的渲染
GUI渲染线程与JS引擎线程互斥,执行JS引擎线程的时候,GUI渲染线程会被挂起,当任务队列空闲的时候,才会执行GUI渲染线程
JS引擎线程:
JS引擎线程主要负责处理JavaScript脚本,执行代码
当事件触发线程,定时触发器线程计时结束,或者异步http请求线程请求成功返回时,一次进入队列,等待JS引擎线程执行脚本代码
该线程和上边的GUI渲染线程互斥,当JS引擎线程执行的收GUI渲染线程将被挂起
定时触发器线程
负责执行异步定时器一类的函数的线程,如:setTimeout,setInterval
主线程依次执行代码时,遇到定时器,会将定时器交给该线程处理,当计数完毕后,事件触发线程会将计数完毕后的事件加入到任务队列的尾部,等待JS引擎线程执行
HTTP请求线程
负责执行异步请求一类的函数的线程,如:Promise,axios,ajax等
主线程依次执行代码时,遇到异步请求,会将函数交给该线程处理,当监听到状态码变更,如果有回调函数,事件触发线程会将回调函数加入到任务队列的尾部,等待JS引擎线程执行
多进程浏览器什么情况下会创建进程呢?
1.Browser进程,浏览器只有一个。
2.render进程,浏览器回为每一个tab页面创建一个render进程,如果我们打开多个空白页面的时候,会将它们render进程合并为一个,也就是说,浏览器允许两个相关联的并属于同一个站点的网页共享同一个render进程
3.第三方插件进程,对于每一种类型的插件,当第一次访问使用这个插件的时候,浏览器就会创建一个插件进程,当使用该插件的所有页面关闭后,那么第三方插件进程也会被关闭
浏览器从单进程到多进程解决的问题:
1.解决了不稳定的问题
每个Tab页面都是一个独立的进程,互不影响。另外将第三方插件进程也单独分离了出来,这样就算一个页面插件出现了问题,也不会影响该页面的渲染进程,也不会对浏览器造成影响。
2.解决不流畅
在多进程下,JavaScript是运行在自己渲染进程中,几遍JavaScript阻塞了渲染进程,收到影响的也仅仅是当前渲染的页面。运行中的脚本也是这样的道理。对于常常引发的内存泄漏,多进程下,关闭一个页面会将渲染进程关闭,操作系统会回收这个进程所占用的内存,也就不会造成内存泄漏的问题了。(关闭页面会回收该页面泄露的内存)
3.解决不安全
渲染进程被沙箱(Sandbox)隔离,网页 web 代码内容必须通过 IPC 通道才能与浏览器内核进程通信,通信过程会进行安全的检查。
这样做的目的是为了让不可信的代码运行在一定的环境中,从而限制这些代码访问隔离区之外的资源。如果因为某种原因,确实需要访问隔离区外的资源,那么就必须通过的指定的通道,这些通道会进行严格的安全检查,来判断请求的合法性。
Chrome 中的每一个标签页都是一个沙箱(sandbox)。为了防止“恶意软件破坏用户系统”或“利用标签页影响其他标签页”。沙箱遵循最小权限原则,每个动作的权限都会被限制,仅能运算而无法写入文件和从敏感区域(即受保护区域)读取文件(如我的文档、桌面)
SOA架构
浏览器结构从单进程到多进程,从性能,安全等方面提大大提高了,2016年 Chrome 团队就开始使用 “面向服务的架构”(SOA)的思想来设计新的 Chrome 架构。简单来说SOA就是一种组件模型,他将应用程序的不同功能单元通过这些服务之间所定义好的接口或者契约联系起来。接口采用中立的方式来进行定义,独立于硬件平台、操作系统以及编程语言。这使得构建各种各样的系统中的服务都可以以一种统一和通用的方式来进行交互。