The Wayback Machine - https://web.archive.org/web/20221028212314/https://baike.sogou.com/kexue/d10072.htm

缓存(计算)

编辑
CPU内存与缓存的关系图

在计算中,缓存是存储数据的硬件或软件组件,以便将来可以提供更快的数据请求;存储在高速缓存中的数据可能是早期计算的结果,也可能是存储在其他地方的数据的副本。当可以在缓存中找到请求的数据时,会发生缓存命中,而当无法找到时,则会发生缓存丢失。缓存命中是通过从缓存中读取数据来实现的,这比重新计算结果或从较慢的数据存储中读取数据要快;因此,缓存中提供的请求越多,系统执行得越快。

为了节省成本并能够有效利用数据,缓存必须相对较小。然而,缓存已经在许多计算领域得到证明,这是因为典型的计算机应用程序访问数据时具有高度的访问局部性。这种访问模式表现出时间局部性(请求最近已经请求的数据)以及空间局部性(请求物理上存储在已经请求的数据附近的数据)。

1 动机编辑

在大小和速度之间有一个内在的权衡(假设资源越大意味着物理距离越大),但同时也存在昂贵的高端技术(如静态随机存取存储器SRAM)和便宜的、易于大规模生产的低端产品 (如动态随机存取存储DRAM器或硬盘)的差异。

缓存提供的缓冲对带宽和延迟都有益处:

1.1 延迟

较大的资源会导致访问延迟,例如,现代4千兆赫处理器可能需要数百个时钟周期才能到达动态随机存取存储器DRAM。这一过程可以通过块存储读取来缓解,这种方法期望后续读取来自其附近的位置从而减少访问延迟。预测或显式预取也可以猜测未来的读取来自何处,并提前发出请求;如果操作正确,延迟将被完全忽略。

1.2 吞吐量(带宽)

通过将多个细粒度传输组合成更大、更高效的请求,缓存的使用还允许从底层资源获得更高的吞吐量。在动态随机存取存储器DRAM电路中,可以通过具有更宽的数据总线来实现。例如,考虑一个程序访问32位地址空间中的字节,但由128位片外数据总线提供服务;单个非缓存的字节访问只允许使用总带宽的1/16,80%的数据移动的是其内存地址,而不是数据本身。读取更大的块存储减少了传输地址信息所需的带宽份额。

2 操作编辑

硬件将缓存实现为一个内存块,用于临时存储可能再次使用的数据。中央处理器(CPU)和硬盘驱动器(HDD)经常使用高速缓存,网络浏览器和网络服务器也是如此。

缓存由一个个条目组成。每个条目都有相关联的数据,这些数据是某个后备存储中相同数据的副本。每个条目也有一个标签,这个标签指定了后备存储中副本条目数据的身份。

当缓存客户端(中央处理器、网络浏览器、操作系统)需要访问假定存在于后备存储器中的数据时,它会首先检查缓存。如果可以找到标签与所需数据相匹配的条目,则使用条目中的数据。这种情况称为缓存命中。例如,一个网页浏览器程序可能会检查它在磁盘上的本地缓存,以查看它是否在特定的网址上(URL)有网页内容的本地副本。在这个例子中,网址是标签,网页的内容是数据。导致高速缓存命中的访问百分比称为缓存命中率或命中率。

另一种情况是,当检查缓存却发现未包含任何带有所需标签的条目时,称为缓存丢失。这需要从后备存储中花费更大的开销来访问数据。一旦检索到请求的数据,通常会将其复制到缓存中,为下一次访问做好准备。

在缓存丢失期间,会删除一些其他先前存在的缓存条目,以便为新检索的数据腾出空间。用于选择要替换的条目的启发式方法称为替换策略。一种比较常见的替换策略“最近最少使用”(LRU)用于替换最旧的条目,即访问次数较少的条目。更高效的缓存算法是根据存储内容的大小计算使用命中频率,以及缓存和后备存储的延迟和吞吐量。这对于较大的数据量、较长的延迟和较慢的吞吐量非常有效,例如硬盘和网络,但是对于在中央处理器CPU缓存中的使用效率不高。

2.1 读写策略

具有无写分配的直写缓存流程

具有写分配的回写缓存流程

当系统将数据写入缓存时,它必须在某个时刻将该数据写入后备存储。这种写入的定时由所谓的写入策略控制。有两种基本的写入方法:

  • 直写:对缓存和后备存储同时执行写操作。
  • 回写(也称为后写):最初,只对缓存进行写操作。对后备存储器的写入被推迟,直到修改的内容将要被另一个缓存块替换。

回写缓存的实现更加复杂,因为它需要跟踪哪些位置已经完成写入,并将它们标记为“dirty(被用过的)”,以便之后写入后备存储中。这些位置中的数据只有在从缓存中被删除时才会被写回后备存储,这种效果称为写入延迟。因此,回写高速缓存中丢失数据(需要用另一个块替换一个块)通常需要两次内存访问:一次是将替换的数据从高速缓存写回存储,另一次是检索所需的数据。

其他策略也可能触发数据回写。客户端可以对缓存中的数据进行许多更改,然后明确通知缓存回写数据。

由于写操作时没有数据返回给请求者,因此无论数据是否会加载到缓存中,都需要对写失败的操作做出决策。这由这两种方法定义:

  • 写分配(也称为写时提取):写入位置中丢失的数据被加载到缓存中,然后执行写命中操作。在这种方法中,写缺失和读缺失类似。
  • 无写分配(也称为无写分配或回写):写入位置中缺失的数据不会加载到缓存中,而是直接写入后备存储。在这种方法中,数据只在读取缺失时加载到缓存中。

直写和回写策略都可以使用这两种写缺失策略中的任何一种,但是它们通常是以这种方式配对的:[1]

  • 回写缓存使用写分配,同时期望后续写入(甚至读取)到现在缓存的同一位置。
  • 直写缓存使用无写分配。这种方法后续写入没有优势,因为它们仍然需要直接写入后备存储中。

缓存以外的实体可能会更改后备存储中的数据,在这种情况下,缓存中的副本可能会过时或老旧。或者,当客户端更新缓存中的数据时,其他缓存中这些数据的副本将变得陈旧。保持数据一致的高速缓存管理器之间的通信协议称为一致性协议。

3 硬件缓存示例编辑

3.1 中央处理器CPU缓存

中央处理器CPU上或靠近CPU的小型内存会比大得多的主内存运行得更快。自20世纪80年代以来,大多数中央处理器CPU都使用了一个或多个缓存,有时是级联的;现代高端嵌入式、桌面和服务器微处理器可能有多达六种类型的缓存(在级别和功能之间)。[2] 具有特定功能的缓存的例子是内存管理单元的数据缓存D-cache和信息缓存I-cache以及MMU的转换后备缓冲器。

3.2 GPU缓存

早期的图形处理单元(GPU)通常只有有限的只读纹理缓存,并引入莫顿次序的混合纹理来提高2D缓存的一致性。缓存丢失将极大地影响性能,例如不使用多级渐远纹理时。缓存对于利用纹理数据的32位(或更宽的数据位)传输非常重要,这些数据通常至少每个像素有4位数据,通过任意UV坐标和反向纹理映射中的透视变换以复杂模式对其进行索引。

随着图形处理器GPU的发展(特别是图形处理器计算着色器GPGPU的出现),他们已经开发出越来越大且越来越通用的缓存,包括着色器的指令缓存,显示出与CPU缓存越来越通用的功能。[3] 例如,GT200架构的图形处理器没有L2高速缓存,而费米图形处理器(Fermi GPU)有768千字节的最后一级高速缓存,开普勒图形处理器( Kepler GPU)有1536千字节的最后一级高速缓存,[3] 麦克斯韦图形处理器(Maxwell GPU)有2048千字节的最后一级高速缓存。这些缓存已经成长为处理线程和原子操作之间的同步原语,并与具有中央处理器风格的内存管理单元MMU进行接口。

3.3 DSP

多年来,数字信号处理器也得到了类似的普及。早期的设计使用高速暂存存储器,由直接存储器(DMA)读取。但是像高通六边形这样的现代DSP通常包含一组与中央处理器(CPU)非常相似的缓存(例如,具有共享L2和分离L1的动态和静态缓存的改良哈佛体系结构)[4]

3.4 转换后备缓冲器

从主存储器获取页表条目的存储器管理(MMU)单元具有专用高速缓存,用于记录虚拟地址到物理地址转换的结果。这个专用缓存被称为转换后备缓冲区(TLB)[5]

4 软件缓存编辑

4.1 磁盘缓存

虽然中央处理器(CPU)缓存通常完全由硬件管理,但各种软件管理其他缓存。主内存中的页面缓存是磁盘缓存的一个例子,由操作系统内核进行管理。

虽然磁盘缓冲区是硬盘驱动器的一个集成部分,有时被错误地称为“磁盘缓存”,但它的主要功能是写排序和预读取。由于缓冲区的大小与驱动器的容量相比较小,重复的缓存命中相对较少。但是,高端磁盘控制器通常有自己的硬盘数据块的机载缓存。

最后,快速本地硬盘驱动器还可以缓存保存在更慢的数据存储设备上的信息,例如远程服务器(网络缓存)或本地磁带驱动器或光盘机;这种方案是分层存储管理的主要概念。此外,基于闪存的快速固态驱动器(SSD)可以被用作慢速旋转介质硬盘驱动器的缓存,也可作为混合驱动器或固态混合驱动器(SSHD)一起工作。

4.2 Web缓存

网络浏览器和网络代理服务器使用网络缓存来存储以前来自网络服务器的响应,例如网页和图像。网络缓存减少了需要通过网络传输的信息量,因为以前存储在缓存中的信息通常可以重复使用。这就降低了网络服务器的带宽和处理需求,并有助于提高网络用户的响应能力。[6]

网络浏览器使用内置的网络缓存,但是一些互联网服务提供商(ISP)或组织也使用缓存代理服务器,这是在该网络的所有用户之间共享的网络缓存。

另一种缓存形式是P2P缓存,对等应用程序最需要的文件存储在ISP缓存中,以加速P2P传输。类似地,分散的对等网络也存在,允许社区对P2P流量执行相同的任务,例如Corelli。[7]

4.3 记忆化

缓存可以存储按需计算的数据,而不是存储从后备存储中检索的数据。记忆化是一种优化技术,它将资源消耗型的函数调用结果存储在查找表中,允许后续调用已存储的结果并避免重复计算。它与动态编程算法的设计方法有关,也可以被认为是一种缓存方法。

4.4 其他缓存

绑定DNS的后台进程缓存是一种到IP地址域名的映射,解析程序库也是如此。

当在不可靠的网络(如以太网局域网)上运行时,直写操作很常见,因为当通信不可靠时,多个回写缓存之间需要的一致性协议非常复杂。例如,网页缓存和客户端网络文件系统缓存(如网络文件系统NFS或服务器信息块SMB中的缓存)通常是只读或直写的,以保持网络协议简单可靠。

搜索引擎也经常从缓存中获取他们索引的网页。例如,谷歌在每个搜索结果旁边提供了一个“缓存”链接。当来自网络服务器的网页暂时或永久不可访问时,这一做法将会非常有用。

另一种类型的缓存是存储可能再次需要的计算结果,即记忆化。例如,ccache是一个缓存编译输出的程序,以便加速以后编译运行。

数据库缓存可以大大提高数据库应用程序的吞吐量,例如数据库缓存在索引、数据字典和经常使用的数据子集的处理中发挥了很大的作用。

分布式缓存[8] 使用联网主机为应用程序提供可扩展性、可靠性和应用性能。[9] 主机可以位于同一地点,也可以分布在不同的地理区域。

5 缓冲与缓存编辑

“缓冲区”和“缓存”的语义并非完全不同;即便如此,缓存过程和缓冲过程在本质上还是很大的不同。

从根本上说,缓存实现了对重复传输的数据传输性能的提升。虽然缓存系统可以在数据项的初始(通常是写)传输时实现性能的提高,但是这种性能的提高是由于缓存系统内发生了缓冲。

对于读缓存,数据项必须至少从其驻留位置提取一次,以便随后读取数据项,从而通过能够从缓存的(更快的)中间存储位置而不是数据的驻留位置提取来实现性能提高。通过将数据项立即存储在高速缓存的中间存储器中,推迟在稍后阶段将数据项传送到其驻留存储器中,或者作为后台进程发生,从而利用写高速缓存,在数据项的第一次写入时实现写入数据项的性能提高。与严格的缓冲相反,缓存过程必须遵守(潜在的分布式)缓存一致性协议,以保持缓存的中间存储和数据所在位置之间的一致性。另一方面,缓冲

  • 减少了通信过程中其它新数据的传输次数,这种传输将几次小传输所涉及的开销分摊到更少、更大的传输上;
  • 或为无法在彼此之间直接传输的通信流程提供中介;
  • 确保传输中涉及的至少一个通信过程所需的最小数据大小或表示形式。

对于典型的缓存实现,第一次读取或写入的数据项被有效地缓存;并且在写入的情况下,主要实现写入点的应用程序的性能提高。此外,在缓存协议中,将单个写入延迟到一批写入的部分是一种缓冲形式。缓存协议中将单个读取延迟到一批读取的部分也是一种缓冲形式,尽管这种形式可能至少对初始读取的性能产生负面影响(但是对单个读取的总和的性能产生正面影响)。实际上,缓存几乎总是涉及某种形式的缓冲,而严格的缓冲不涉及缓存。

缓冲区是传统上使用的临时存储位置,因为中央处理器CPU指令不能直接寻址存储在外围设备中的数据。因此,可寻址存储器被用作中间级。此外,当大块数据被组合或分解时(根据存储设备的要求)或者当数据以不同于其产生的顺序被传送时,这种缓冲器可能是可行的。此外,整个数据缓冲区通常按顺序传输(例如,传输到硬盘),因此缓冲本身有时会提高传输性能或降低传输延迟的变化或抖动,而缓存的目的是减少延迟。即使缓冲的数据被写入缓冲区一次,从缓冲区读取一次,这些好处仍然存在。

缓存还可以提高传输性能。增长的一部分原因可能是来自多个小传输合并成一个大块数据。但是主要的性能提升是因为往往需要从缓存中多次读取相同的数据,或者很快读取写入。缓存的唯一目的是减少对底层较慢存储的访问。缓存通常也是一个抽象层,从相邻层的角度来看,它是不可见的。

参考文献

  • [1]

    ^John L. Hennessy; David A. Patterson (16 September 2011). Computer Architecture: A Quantitative Approach. Elsevier. pp. B–12. ISBN 978-0-12-383872-8. Retrieved 25 March 2012..

  • [2]

    ^"intel broad well core i7 with 128mb L4 cache".Mentions L4 cache. Combined with separate I-Cache and TLB, this brings the total 'number of caches (levels+functions) to 6.

  • [3]

    ^S. Mittal, "A Survey of Techniques for Managing and Leveraging Caches in GPUs", JCSC, 23(8), 2014..

  • [4]

    ^"qualcom Hexagon DSP SDK overview"..

  • [5]

    ^Frank Uyeda (2009). "Lecture 7: Memory Management" (PDF). CSE 120: Principles of Operating Systems. UC San Diego. Retrieved 2013-12-04..

  • [6]

    ^Multiple (wiki). "Web application caching". Docforge. Retrieved 2013-07-24..

  • [7]

    ^Gareth Tyson; Andreas Mauthe; Sebastian Kaune; Mu Mu; Thomas Plagemann. Corelli: A Dynamic Replication Service for Supporting Latency-Dependent Content in Community Networks (PDF). MMCN'09. Archived from the original (PDF) on 2015-06-18..

  • [8]

    ^Paul, S; Z Fei (1 February 2001). "Distributed caching with centralized control". Computer Communications. 24 (2): 256–268. CiteSeerX 10.1.1.38.1094. doi:10.1016/S0140-3664(00)00322-4..

  • [9]

    ^Khan, Iqbal (July 2009). "Distributed Caching On The Path To Scalability". MSDN. 24 (7)..

阅读 5820
版本记录
  • 暂无