转载请注明原文地址:http://blog.csdn.net/milado_nju
## 概述
想象一下,如果没有磁盘缓存的世界。当用户访问网页的时候,每次浏览器都需要从网站下载网页,图片,JS等资源,这其实费力又不讨好。解决这一问题的方法就是将之前浏览器下载的资源保存下来,存到磁盘中,以备今后使用。当然,资源有时效性,也会变的不再有效,所以有相应的退出机制来解决这一问题。在现代浏览器中,绝大多数浏览器都有磁盘缓存机制,因为它确实能够提高网页的加载速度,能够省去了网络的时间。
## 特性
为了适应的网络资源的本地缓存需求,Chromium的磁盘本地缓存有几个特性或者要求:
第一,磁盘空间不是无限大的,虽然需要缓存的资源可能很多,所以必须要相应的机制来移除合适的缓存资源,以便加入新的资源。
第二,能够处理浏览器崩溃时候不破坏磁盘文件,至少能够保护原先在磁盘中的数据。
第三,能够高效和快速的访问磁盘中的现有数据结构,支持同步和异步两种访问方式。
第四,能够避免同时存储两个相同的资源。
第五,能够很方便的从磁盘中删除一个项,同时可以在操作一个项的时候不受其它请求的影响。
还有些其它的特性,这里不再一一介绍。这些既是磁盘本地缓存的需要,同时也是Chromium的设计目标,让我们一起看看下面介绍的结构是如何做到这些的。
## 结构
在理解内部结构之前,我们来看一看对外的接口设计。笔者认为这个接口设计很清晰简单(跟Chromium中的一些其他接口比较),有两个类,Backend和Entry。Backend表示整个磁盘缓存,所有针对磁盘缓存操作的主入口,表示的是一个缓存表。Entry类指的是表中的表项。缓存通常是一个表,对于整个表的操作作用在Backend上,还包括创建表中的一个个项,每个项是关键字来唯一确定,这个关键字就是资源的URL。而对项目内的操作,包括读写等都是由Entry类来处理。读者可以通过在地址栏输入“
chrome://view-http-cache/”来查看这些项。下图是一个表项的内部存储内容。
下面介绍表和表项是如何被组织和存储在磁盘上的。在磁盘上,Chromium至少需要一个索引文件和四个数据文件。索引文件用来检索存放在数据文件中的众多索引项,用来索引表项。数据文件又称为块文件,里面包含很多特定大小的块(例如256字节或者1k字节),用于快速检索,这些数据块的内容是表项,包括HTTP文件头,请求数据和资源数据等等,数据文件名形如“data_1”,“data_2”等。
当资源文件大小超过一定值的时候,Chromium建立单独的文件来保存它们,而不是将它们方式上面的4个数据文件中。这些单独文件没有元数据信息,只是资源文件内容,而文件名形如“f_xxxxx”,其中xxxxx是5个数字或者ABCDEF(16进制),用于表示编号。
索引文件的结构定义包括一个索引的头部和索引地址表。头部用来表示该索引文件的信息,例如索引文件版本号,索引项数量,文件大小等等信息。而索引地址表就是保存各个表项对应的索引地址。该索引文件是直接将文件映射到内存地址,这样可以快速的找到表项的索引地址。索引地址的含义以下面两个例子作如下解释:
0x8000001C: 前四位的8表示这个地址指向的表项是一个单独的文件(说明内容大于特定值),后面20位表示文件的名字中的编号,所以文件名为”f_0001C”。
0xA0020001: 前四位的A表示这个地址指向的表项是存入数据文件”data_2”的第一个块。
这些表示可能不是固定地,以后也可能发生改变,但是基本思想还是这样。数据文件的结构总体上也是类似,它也是一个文件头加上后面的块文件。前面说过,每个块大小是固定的,例如512字节,所以当需要超过512的时候,可能会为其分配多个块来解决这一问题。但是,最多不能够超过四个块(前面说过大于这个通常是单独的文件)。另一方面,如果一个表项需要分配四个块,则通常是跟块在文件中的索引位置是对齐的,也就是起始块的位置是4的倍数。
表项的结构也分为两个部分,第一部分用于标记自己,包括各种元数据信息和自身的内容,通常它是较少变动得,Chromium中用disk_cache::EntryStore表示。另一部分是经常发生变动,Chromium中用disk_cache::RankingsNode表示,它的大小固定,主要是为了表项的回收算法服务的,里面保存了回收算法所需要的信息。EntryStore结构可以查阅代码。它有一些标记该表项的数据,例如“hash”,“key”等。”key”其实是资源的URL,如果URL过于长,那么”long_key”是就派上了用场,可以用一个或者多个块来存储。”data_addr”可以存储多达4个地址,它们指向不同的位置,这些地址可以表示HTTP头,资源内容等。
总结上面的描述,可以描绘出磁盘缓存的存储结构如下图所示。
Chromium使用LRU(Least RecentUsed)最近最少使用算法来回收表项。因为磁盘存储的空间是优先的,不能无限的增长下去,所以对于很少使用到的表项,回收这一部分磁盘空间。
## 参考资料
1.http://www.chromium.org/developers/design-documents/network-stack/disk-cache
by yongsheng@chromium.org
分享到:
相关推荐
WebKit和Chromium源码及原理剖析
Docker 中的 Chromium 浏览器 如果您想知道如何在 Docker 中运行 Chromium。 这个 docker image 可能是一个解决方案。 在 Docker 中运行 Chrome 的需要有助于部署测试。 例如,您可能有另一个 docker 镜像正在运行,...
用于Chromium的Docker容器 这是Chromium的Docker容器。 可通过现代Web浏览器(无需在客户端上进行安装或配置)或任何VNC客户端来访问应用程序的GUI。 非常感谢@jlesage。 该图像基于 表中的内容 取消RAID 用户/...
Chromium是一个开放源代码的浏览器项目,旨在为所有Internet用户构建一种更安全,更快,更稳定的方式来体验Web。该站点包含设计文档,体系结构概述,测试信息等,以帮助您学习构建和使用Chromium源代码。
chrome/Chromium缓存查看chrome cache view 提取chrome缓存纪录
Chromium是一个开放源代码的浏览器项目,旨在为所有Internet用户构建一种更安全,更快,更稳定的方式来体验Web。该站点包含设计文档,体系结构概述,测试信息等,以帮助您学习构建和使用Chromium源代码。
底层基于(Chromium49/51)/(CEF3.2623/CEF3.2704)内核进行制作,支持系统XP,03,Vista,Win7/8/10 32/64。 技术支持: 内核: WebKit/Chromium/CEF3
高朗ChromeDocker映像包Golang和Chromium,基于golang:1-alpine 。执照麻省理工学院
未谷Chrome 消除Google Web服务依赖性的轻量级方法 欢迎帮助! 有关更多信息,请参阅文档。 目标 按重要性降序(即最重要的目标...在不登录Google帐户的情况下,Chromium在安全性和隐私性方面做得很好。 但是,Chrom
要使用它们,您需要: 构建及其和自定义版本。 查看您感兴趣的Chromium版本: $ git submodule init$ git submodule update --reference . v42 # or v32, or... 使用run-gyp命令运行带有FreeBSD适当参数的Gyp...
是由The Chromium Project开发和维护的开源Web浏览器。 谷歌浏览器也于2008年发布,是由谷歌开发和维护的专有网络浏览器。 Chrome和Chromium相互绑定的原因是Chome借用了Chromium的源代码。 使用Chromium的主要好处...
AndroidChromium 简单的介绍 谷歌浏览器android版源程序 该项目是世界一流的android体系结构 澄清项目业务逻辑可以完全适合国内公司工程师 该项目将长期跟踪和更新Google浏览器内核版本,欢迎加入星号 注意 如果您...
Portapps未与Ungoogled Chromium:trade_mark:或其任何子公司或分支机构有任何关联,关联,授权,认可或以任何方式与之正式关联。 可以在上找到Ungoogled Chromium:trade_mark:官方网站。 Ungoogled Chromium:trade...
如何从此水龙头安装Chromium 通过公式: brew install domt4/chromium/chromium 通过木桶: brew cask install domt4/chromium/mac-chromium 然后将以常规方式获取更新: brew update brew upgrade Chrome发布...
Chromium:45.0.2454.101 WebKit:537.36 此版本不自动支持flash 开启方法添加工程文件添加 procedure AppendCefCmdline(const processType: ustring; const cmd: ICefCommandLine); begin cmd.AppendSwitch('enable-...
ChromeChromium开发版本:macOS和Windows-所有编解码器仅64位
当前版本安装brew tap mtslzr/marmaduke-chromiumbrew updatebrew install marmaduke-chromium酒桶此水龙头包括Marmaduke Chromium的三个版本: marmaduke-chromium包括Google Sync和wildvine(适用于Netflix的DRM...
众所周知, chromium 是多进程框架的,整个 chromium 浏览器包括四类进程: browse 主进程、 render 渲染进程、 GPU 进程和插件进程。本文所要讲述的 chromium 事件处理流程 主要牵涉到其中的两种进程: browser ...
AndroidChromium 简单的介绍 谷歌浏览器android版源程序 该项目是世界一流的android体系结构 澄清项目业务逻辑可以完全适合国内公司工程师 该项目将长期跟踪和更新Google浏览器内核版本,欢迎加入星号 注意 如果您...
该存储库包含有关对信息。 它还为贡献者和审阅者提供了一些工具,以协助完成。 三星对Chromium开源项目的清单。 Chromium开源项目的代码审查中的列表。