最近开始学习浏览器工作原理,网上的资料比较零散且不体系。正好发现有门课程(浏览器工作原理与实践)不错,整理下学习笔记。
前置知识
在学习浏览器多进程架构前,我们需要先了解下进程与线程。
- 进程:一个运行程序的实例,也就是启动一个程序的时候,操作系统会为该程序创建一块内存,用来存放代码、运行中的数据和一个执行任务的主线程,我们把这样的一个运行环境叫进程。
- 线程:不能单独存在,需要进程启动和管理。
在进程中使用多个线程进行并行处理可以提升运算效率。
进程与线程之间的关系:
- 进程中的任意线程出错,会导致整个进程崩溃
- 线程之间的数据是共享的,进程之间的内容相互隔离
- 当进程关闭后,操作系统会回收进程所占用的内存
为什么要采用多进程架构
浏览器的多进程架构其实是一步步进化的,一开始浏览器是单进程,导致有一个线程出问题浏览器就会崩溃,例如很早的浏览器一个页面挂了其他页面也跟着挂了。
为了解决单进程导致的不稳定、不流畅和不安全,chrome团队提出了多进程架构。
多进程架构具体是指什么
- 浏览器进程:负责界面展示、用户交互及子进程管理,同时提供存储功能。
- 渲染进程:负责将html、js和css转换为网页,排版引擎Blink和JavaScript引擎在该进程中。
- GPU进程:负责css 3D、网页及chrome的UI界面的绘制。
- 网络进程:负责网络资源的加载。
- 插件进程:负责插件的运行。
目前多进程架构缺点是什么
- 更高的资源占用:因为每个进程都包含公共的基础结构的副本(JavaScript运行环境)
- 更复杂的体系架构:各模块耦合度高、扩展性差,新的需求难以适用
未来面向服务的架构
Chrome 官方团队使用"面向服务的架构"(Services Oriented Architecture,简称 SOA)的思想设计了新的 Chrome 架构,各种模块会被重构成独立的服务。
每个服务都可以在独立的进程中运行,访问服务必须使用定义好的接口,通过 IPC 来通信,从而构建一个更内聚、松耦合、易于维护和扩展的系统,更好实现 Chrome 简单、稳定、高速、安全的目标。
理论结合实践
既然提到多进程架构,那么我们如何查看页面有哪些进程?
用chrome打开一个任意页面,点击浏览器右上角,弹出下拉菜单选择更多工具,然后再选择任务管理器即可。如图所示:
一般包括:浏览器进程、渲染进程、GPU进程和网络进程,如果安装了扩展或者插件还会有插件进程和扩展进程,另外还有v8代理解析工具等进程。
当我们再次打开一个新的页面时,发现渲染进程增加了?
这是因为Chrome会为每个Tab标签创建一个渲染进程,防止一个页面崩溃不影响其他页面。
扩展:
1:如果页面里有iframe的话,iframe也会运行在单独的进程中
2:如果页面里有插件,同样插件也需要开启一个单独的进程
3:如果你装了扩展的话,扩展也会占用进程
4:如果2个页面属于同一站点的话,并且从a页面中打开的b页面,那么他们会公用一个渲染进程(除非特殊处理掉引用关系)
总结
一句话:多进程浏览器架构包括1个浏览器进程、1个网络进程、1个GPU进程、多个渲染进程和多个插件进程。
通过本文了解了浏览器多进程架构的来龙去脉,这也是了解浏览器工作原理的第一步。