浏览器是什么?
对操作系统来说,浏览器只是一个普通的应用程序,和你安装的Steam,QQ 是一样的。
只不过这个程序,承载了一些特殊的功能。
一个浏览器,最基础的功能应该有以下:
1. 支持网络通信
2. 支持HTML,CSS,JS的绘制和执行
3. 支持插件扩展
现代的浏览器支持的功能会更多,但是其核心的能力主要包含以上三个。
数十年来,围绕这些核心功能,浏览器厂商想出各种办法,来保证浏览器更好更快更稳定的运行。本文将以Chrome为例,来浅析浏览器的架构和设计。
多进程设计
Chrome是通过IPC进行信息传递的多线程或多进程程序。
首先要区别一下进程和线程的概念。
一般来讲,一个程序可以启动多个进程,每个进程可以启动多个线程。
对于操作系统来讲,线程是基本的调度单位。
由于进程之间需要协作,因此进程之间需要通过IPC进行数据交换,也就是IPC通信。
Chrome的多进程,是每一个tab页就会启动一个单独的渲染进程。这样的好处是,当某一个tab页卡顿或者崩溃时,其他页面可以正常运行。
多进程带来的负面问题就是,内存占用过高。因为每一个进程,都会占用计算机中最宝贵的资源--内存,因此当进程开的过多是,带来的负担也相应的增加了。\
为了节省内存,Chrome限制了它可以启动的进程数量。这个限制取决于你的设备有多少内存和CPU能力,但是当Chrome达到限制时,它开始在一个进程中从同一个站点运行多个选项卡。
Chrome中主要包含以下进程:
1. 网络进程
2. 存储进程
3. 设备进程
4. 渲染进程, 控制显示网站的选项卡内的任何内容。
5. 插件进程, 控制网站使用的任何插件,例如flash。
6. UI进程
7. GPU进程, 与其他进程隔离处理GPU任务。它被分成不同的进程,因为GPU处理来自多个应用程序的请求并将它们绘制在同一个表面中
8. 浏览器进程 控制应用程序的“chrome”部分,包括地址栏、书签、后退和前进按钮。还处理Web浏览器的不可见的特权部分,例如网络请求和文件访问。
服务化设计
服务化设计类似于后端的微服务设计,Chrome正在进行架构更改,以将浏览器程序的每个部分作为服务运行,从而可以轻松地拆分为不同的进程或聚合为一个。这样更加的灵活和节省空间。
预渲染-网站隔离
站点隔离是最近引入的特性。它为每一个跨站的Iframe运行一个独立的渲染进程。
我们一直在谈论每个选项卡模型一个渲染器进程,它允许跨站点iframe在单个渲染器进程中运行,并在不同站点之间共享内存空间。
在同一个渲染器进程中运行a.com和b.com似乎没问题。
同源策略是网络的核心安全模型;它确保一个站点在未经同意的情况下无法访问其他站点的数据。绕过此策略是安全攻击的主要目标。
进程隔离是分离站点的最有效方法。使用Meltdown和Spectre,我们需要使用进程分离站点变得更加明显。自Chrome67起默认在桌面上启用站点隔离后,选项卡中的每个跨站点iframe都有一个单独的渲染器进程。
启用站点隔离不像分配不同的渲染器进程那么简单;它从根本上改变了iframe相互通信的方式。在一个页面上打开devtools,iframe运行在不同的进程上,这意味着devtools必须实现幕后工作,使其看起来无缝。即使运行简单的Ctrl+F在页面中查找单词也意味着在不同的渲染器进程中进行搜索