浏览器漫长的发展历程中,伴随着进程架构的不断更新迭代。从单进程架构、多进程架构到面向服务架构,目前还在不断过渡。
浏览器中的任务
- 浏览器自身
- 页面渲染(打开新的页面就需要进行新的页面渲染)
- 插件
- 网络请求
- gpu渲染
- audio、video
浏览器所需执行的任务会随着场景不断增多。
单进程架构
- 所有任务都是在同一进程下执行,分发给多个线程。
- 单个线程会执行一个或多个任务。
弊端
-
不稳定
线程中任意一处线程出现问题会导致整个进程崩溃,可能会因为一个插件的问题、一个页面的问题影响到整个浏览器的使用。
-
不流畅
单线程每个时刻只能执行一个任务,如果当前任务执行时间过长,会阻塞后续任务,造成页面卡顿。
-
不安全
未对插件线程进行限制。插件通常可为C、C++程序,可获取到系统层级资源,进行读写操作,有安全隐患。而且,早期浏览器很多功能由插件实现。
多进程架构
将之前各项任务划分到更多进程中。
-
浏览器主进程
主要负责界面显示、用户交互、子进程管理,同时提供存储等功能。
-
渲染进程
负责页面的渲染,将html、css、javascript代码转换为用户可与之交互的页面。chrome的排版引擎blink和js运行引擎v8都在此进程中。为确保安全性,该进程至于沙箱模式(限制权限,不能对系统重要位置进行读写操作)中。
-
网络进程
负责获取页面中远程资源的获取,从浏览器进程中独立出来。
-
插件进程
负责插件的运行,通过这种方式与其他进程隔离,防止因插件崩溃导对浏览器和页面产生影响。
-
GPU进程
页面、chrome的UI界面由GPU渲染,GPU称为浏览器普遍的需求,引入了GPU进程。
弊端
以上的多进程和沙盒隔离解决了之前所述单线程所带来的弊端。
- 使用多进程会带来更高的资源占用。
- 各模块间耦合性高,架构过于复杂,难于扩展,很难满足新的需求。
面向服务的架构
- 将原先的模块重构成服务,每个服务在独立的进程中运行。
- 访问服务须使用定义好的接口,各个进程间通过IPC通信。
- 从而实现了松耦合、易于扩展的目标。
- Chrome 最终要把 UI、数据库、文件、设备、网络等模块重构为基础服务,类似操作系统底层服务。
-
Chrome 还提供灵活的弹性架构,在强大性能设备上会以多进程的方式运行基础服务,但是如果在资源受限的设备上,Chrome 会将很多服务整合到一个进程中,从而节省内存占用。