缓存

缓存是计算机科学中的一个术语。缓存发音为"cash" /ˈkæʃ/ KASH )背后的想法非常简单。通常情况下,获取一个计算结果是非常耗时的,所以存储结果通常是一个好主意。有两种存储介质。一种通常是相当大的,但访问它是"慢"的;另一种可以更快地访问,但通常是小的。缓存背后很基本的思想就是利用访问速度快的介质来拥有数据的副本。副本,和原始数据没有区别。访问原始数据可能需要很长的时间,或者需要很高的成本(例如:一个困难问题的结果,需要很长时间才能解决)。出于这个原因,单纯使用缓存中的数据副本要"便宜"得多。换句话说,缓存是一个临时的存储区域,里面有经常使用的数据副本。当数据的副本在这个缓存中时,使用这个副本比重新获取或重新计算原始数据要快。这将使访问数据所需的平均时间缩短。将一个新的值放入缓存中,往往意味着需要替换一个旧的值。关于如何选择要替换的值,有不同的想法(通常称为"策略")。

缓冲区与缓存非常相似。它的不同之处在于,访问缓冲区中数据的客户端知道有一个缓冲区;缓冲区由应用程序管理。而在缓存中,访问数据的客户端不需要知道有一个缓存。

典型的计算机应用程序访问数据的方式非常相似。假设数据被结构化为"块",可以单独访问。当一个应用程序访问一个块时,它也很可能访问(或引用)一个与原始块"接近"的块。这就是所谓的"引用的位置性"。这种"位置性"有不同的种类。引用的位置性是缓存在许多计算领域工作良好的原因之一。

为了能很好地工作,与整个数据量相比,缓存是很小的。缓存越大,查找一个条目的时间就越长。更大的缓存构建成本也更高。

缓存如何工作

缓存是存储数据的内存块,这些数据可能会被再次使用。CPU硬盘经常使用缓存,网络浏览器和网络服务器也是如此。

一个缓存是由许多条目组成的,称为一个。每个条目都持有一个数据元(数据位),它是另一个地方的数据元的副本。缓存通常使用所谓的备份存储。与缓存相比,后备存储的访问速度很慢或成本很高。例如,磁盘缓存使用一个硬盘作为后备存储。每个条目还附加了一个小信息,叫做标签。这个标签用来寻找原始数据的存储位置。

缓存阅读

客户端(CPU、Web浏览器、操作系统)要访问一点数据,它认为是在后备存储中的,它首先检查是否能在缓存中找到这个数据。如果能在缓存中找到数据,客户端就可以使用它,而不需要使用主内存。这就是所谓的缓存命中。因此,举例来说,一个网络浏览器程序可能会检查它在磁盘上的本地缓存,看看它是否有一个特定URL的网页内容的本地副本。在这个例子中,URL是标签,网页的内容是数据。

另一种情况是,在缓存中找不到带有标签的数据元。这就是所谓的缓存丢失。需要从后备存储中获取该数据元。通常,它会被复制到缓存中,这样下次就不需要再从后备存储中获取了。

缓存的大小是有限的。为了给之前未缓存的条目腾出空间,可能需要从缓存中删除另一个缓存条目。特殊的规则被用来寻找最应该被删除的条目。这些规则通常被称为Heuristics。用来寻找条目的启发式方法称为替换策略。一个非常简单的规则叫做最近使用的条目(或LRU)。它只是简单地采用了最久之前使用的条目。其他的启发式方法在缓存算法中列出......。

用于写作的缓存

缓存也可以用于写入数据;这样做的好处是,一旦条目被写入缓存,客户端就可以继续操作;它不必等到条目被写入后盾存储。

然而,该条目必须在某个时间点被写入备份存储中。这种情况发生的时间由写入策略控制。

写通式缓存中,每个条目都会被立即写入到后备存储中,同时也被存储在缓存中。

另一种选择是只写到缓存,然后再写到后备存储。这就是所谓的回写(或回写)缓存。缓存对尚未写到后盾存储的条目进行标记;使用的标记通常被称为标志。在从缓存中删除条目之前,它们会被写入到后备存储中。这就是所谓的懒惰写。回写缓存中的漏写(需要一个块被另一个块替换)往往需要两次内存访问:一次是为了获得所需的数据元,另一次是为了将替换后的数据从缓存中写入存储。

缓存策略也可以说某个数据元必须写入缓存。客户端可能已经对缓存中的数据元做了很多修改。做完之后,它可能会明确地告诉缓存要把数据元写回来。

无写分配是一种只对读进行缓存的缓存策略。这样就避免了回写或穿透缓存的需要。写入是一直对后备存储进行的。

客户端不是改变备份存储中数据的应用程序。如果备份存储中的数据发生了变化,缓存中的副本将过时,或者说是陈旧的。另外,当客户端更新缓存中的数据时,该数据在其他缓存中的副本也会变得陈旧。有一些特殊的通信协议,允许缓存管理器相互交谈以保持数据的意义。这些协议被称为一致性协议

CPU内存缓存示意图Zoom
CPU内存缓存示意图

选择要替换的条目

缓存很小,大部分时间都会满,或者几乎满。所以当增加一个新的值时,需要删除一个旧的值。这种选择有不同的方式。

  • 先入先出。只需替换最久之前被添加到缓存中的条目即可
  • 最近使用的时间最少。这种想法与上述先进先出法类似,但当一个条目被使用时,其时间戳/年龄会被更新。
  • 使用频率最低。同样,与FIFO的情况类似,不使用时间戳,而是使用一个计数器,每次使用一个条目时,计数器都会递增。
  • 随机抽取一个作品

历程

1967年,字形缓存首次用于计算,当时准备在IBM系统杂志上发表一篇科学文章。该文章是关于85型计算机中存储器的新改进。85型是IBM System/360产品系列中的一台计算机。该杂志的编辑希望给文章中使用的高速缓冲器找一个更好的词。他没有得到任何意见,于是建议用cache,来自法语cacher,意思是"隐藏"。文章于1968年初发表,作者受到了IBM的表彰。他们的工作得到了广泛的欢迎和改进。Cache很快成为计算机文献中的标准用法。

使用缓存的地方

CPU缓存

CPU芯片上或靠近CPU芯片的小存储器可以比大得多的主存储器更快。自20世纪80年代以来,大多数CPU都使用了一个或多个缓存。现代个人电脑内的通用CPU可能有多达六七个。每个高速缓存可能专门用于执行程序任务的不同部分。

磁盘缓存

CPU缓存一般完全由硬件管理,其他缓存由不同种类的软件管理。操作系统通常在主内存中管理一个页面缓存。计算机科学以外的用户通常把这种缓存称为虚拟内存。它是由操作系统的内核管理的。

现代硬盘有磁盘缓冲区。这些缓冲区有时被称为"磁盘缓存",但这是错误的。这些缓冲区的主要功能是对磁盘写入进行排序,并管理读取。重复的缓存命中是很少的,因为与硬盘的大小相比,缓冲区非常小。

相对于其他存储设备,如远程服务器、本地磁带机或光盘唱机,本地硬盘的速度很快。将本地硬盘作为缓存,是分级存储管理的主要概念。

网络缓存

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

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

搜索引擎也经常从它们的缓存中提供它们已经索引的网页。例如,谷歌在每个搜索结果旁边提供了一个"缓存"链接。当网页暂时无法从网络服务器访问时,这个链接就很有用。

在不可靠的网络中进行缓存

写入操作在不可靠的网络(如以太网局域网)中很常见。在这种情况下,当使用多个写缓存时,用于确保写缓存中的数据有意义的协议是非常复杂的。

例如,网页缓存和客户端网络文件系统缓存(如NFS或SMB中的缓存)通常是只读或写通的,以保持网络协议的简单和可靠。

缓冲区和缓存的区别

缓冲区和缓存并不是相互排斥的,它们也经常一起使用。不过它们使用的原因是不同的。缓冲区是内存中的一个位置,传统上是因为CPU指令不能直接寻址存储在外围设备中的数据而使用的。计算机内存是作为中间存储使用的。

此外,当一大块数据被组装或拆卸时(按照存储设备的要求),或者当数据可能以不同于其产生的顺序传送时,这种缓冲区可能是可行的。另外,整个缓冲区的数据通常是按顺序传送的(例如传送到硬盘上),因此缓冲本身有时会提高传送性能。即使将缓冲数据写入缓冲区一次,从缓冲区读取一次,也会有这些好处。

缓存也会增加传输性能。一部分的提高同样来自于多个小的传输将合并成一个大块的可能性。但主要的性能提升是因为很有可能同一个数据元会从缓存中多次读取,或者写好的数据很快就会被读取。Cache的唯一目的是减少对底层较慢存储的访问。Cache通常也是一个抽象层,它被设计成从相邻层的角度是不可见的。这样一来,应用程序或客户端可能不知道有一个缓存。

问题和答案

问:什么是高速缓存?
答:缓存是计算机科学中的一个术语,指的是存储经常使用的数据副本的做法,以便比重新获取或重新计算原始数据更快地访问它。

问:缓存是如何工作的?
答:缓存的工作原理是使用两种存储介质,一种通常相当大,但访问速度慢,另一种访问速度快得多,但通常较小。缓存背后的想法是使用快速介质来存储数据的副本,这样访问原始数据所需的时间就会减少,或者成本也会降低。

问:什么是缓冲区?
答:缓冲区与高速缓存类似,它存储数据的副本以加快访问速度,但是对于缓冲区来说,访问数据的客户端知道有一个缓冲区,并且它是由应用程序管理的,而对于高速缓存来说,客户端不需要知道有一个高速缓存。

问:引用的位置性是什么意思?
答:定位参考是指当一个应用程序访问某些结构化数据块时,他们也可能会访问与最初访问的数据块相近的其他块。这有助于缓存工作的顺利进行,因为与所有可用的数据相比,缓存通常很小。

问:为什么更大的缓冲区需要更长的时间来查找条目?
答:更大的缓冲区需要更长的时间,因为它们包含更多的存储信息,因此需要更多的时间来查询。它们也更昂贵,因为它们需要更多的资源来存储。

问:位置性如何帮助缓存更好的工作?
答:位置性有助于使缓存工作得更好,因为当应用程序访问某些结构化数据块时,他们很可能还需要其他附近的数据块,这时就可以从缓存中快速检索,而不是从其他地方获取或重新计算它们。

AlegsaOnline.com - 2020 / 2023 - License CC3