什么是缓存及其工作原理?

作者:Guy Provost  |  更新日期:2024年3月27日
Computer Inner Parts and Networks
缓存过程大大提高了计算机从内存中提取位和字节的速度。Andriy Onufriyenko / Getty Images

如果您一直在购买计算机,那么您一定听说过“缓存”这个词。您可能还从好心的朋友那里得到过关于这个话题的建议,也许是这样的:“别买那个赛扬芯片,它里面没有缓存!”那么,缓存到底是什么呢?

事实证明,缓存是一个重要的计算机科学过程,它以各种形式出现在每台计算机中。现代计算机既有L1和L2缓存,许多现在也有L3缓存。有内存缓存、页面缓存,甚至还有硬件和软件磁盘缓存。虚拟内存也是一种缓存形式

广告

在本文中,我们将解释缓存是什么以及它是如何工作的,以便您理解它为何如此重要。

一个简单的例子:没有缓存之前

缓存是一种基于计算机内存子系统的技术。缓存的主要目的是在保持计算机价格低廉的同时加速您的计算机。缓存使您能够更快速地完成计算机任务。

为了理解缓存系统的基本思想,让我们从一个使用图书管理员来演示缓存概念的超级简单例子开始。让我们想象一个图书管理员坐在他的桌子后面。他在那里为您提供您所要求的书籍。为简单起见,假设您无法自己取书——您必须向图书管理员索取任何您想读的书,然后他会从储藏室的书架上为您取来。(华盛顿特区的美国国会图书馆就是这样设置的。)

广告

首先,让我们从一个没有缓存的图书管理员开始。第一位顾客来了。他要《白鲸记》这本书。图书管理员走进储藏室,取出书,回到柜台,把书交给顾客。后来,顾客回来还书。图书管理员收回书并放回储藏室。然后他回到柜台,等待另一位顾客。

现在,假设下一位顾客要《白鲸记》。图书管理员就必须回到储藏室去取他最近处理过的这本书,然后交给顾客。在这种模式下,图书管理员必须每次都往返取书——即使是非常受欢迎、经常被要求的书也是如此。我们如何提高图书管理员的效率呢?我们给他一个缓存!

广告

一个简单的例子:缓存版本

让我们给图书管理员一个背包,他可以在里面存放10本书(用计算机术语来说,图书管理员现在拥有一个10本书的浏览器缓存)。他会将顾客还给他的书放入这个背包,最多10本。让我们使用前面的例子,但现在用我们改进后的缓存图书管理员。

一天开始了。图书管理员的背包是空的。我们的第一位顾客来了,他要《白鲸记》。这里没有什么魔法——图书管理员必须去储藏室取书。他把书给了顾客。后来,顾客回来把书还给了图书管理员。图书管理员没有回到储藏室还书,而是把书放进了他的背包里,然后站在那里(他首先检查背包是否已满——稍后会详细介绍)。

广告

另一位顾客来了,他要《白鲸记》。在去储藏室之前,图书管理员检查这个书名是否在他的背包(或临时存储区)里。他找到了!这叫做缓存命中。他所要做的就是从背包里取出书,然后交给顾客。没有去储藏室的往返,所以为顾客提供了更高效的服务。

当发生缓存未命中时

如果顾客要的是缓存(背包)中没有的书名呢?在这种情况下,有缓存的图书管理员效率反而比没有缓存的低,因为图书管理员会先花时间在他的背包里找书。缓存设计面临的挑战之一是最小化缓存搜索的影响,现代硬件已将这种时间延迟降低到几乎为零。

即使在我们简单的图书管理员例子中,搜索缓存的延迟时间(等待时间)与走回储藏室的时间相比也微不足道。缓存很小(10本书),注意到缓存未命中的时间只占前往储藏室所需时间的一小部分。

广告

缓存:一个临时存储数据的地方

从这个例子中你可以看到关于缓存的几个重要事实

  • 缓存技术是使用一种更快但更小的内存类型来加速一种更慢但更大的内存类型。它适用于所有操作系统和Web服务器。
  • 使用缓存时,您必须检查缓存以查看其中是否存在某个项目。如果存在,则称为缓存命中。如果不存在,则称为缓存未命中,计算机必须等待从更大、更慢的内存区域往返获取数据。
  • 缓存有一个最大大小,它远小于更大的存储区域。
  • 可以有多个缓存层。在我们的图书管理员示例中,更小但更快的内存类型是背包,而储藏室代表更大更慢的内存类型。这是一个一级缓存。可能还有另一层缓存,由柜台后面可以容纳100本书的书架组成。图书管理员可以先检查背包,然后是书架,最后是储藏室。这将是二级缓存。

广告

缓存内存的级别

计算机是一种我们以非常小的增量来测量时间的机器。当微处理器访问随机存取存储器(RAM)时,它大约需要60纳秒(600亿分之一秒)。这已经相当快了,但比典型的微处理器要慢得多。微处理器的周期时间可以短至2纳秒,因此对微处理器来说,60纳秒似乎是永恒。

如果我们主板上构建一个特殊内存库,它很小但速度非常快(大约30纳秒)呢?这已经比主内存访问快两倍了。这被称为二级缓存或L2缓存。如果我们直接在微处理器芯片内部构建一个更小但更快的内存系统呢?那样,这个内存将以微处理器的速度而不是内存总线的速度进行访问。那是一个L1缓存,在233兆赫兹(MHz)的奔腾处理器上,它比L2缓存快3.5倍,而L2缓存又比主内存访问快两倍。

广告

一些微处理器芯片内部内置了两级缓存。在这种情况下,主板缓存——存在于微处理器和主系统内存之间的缓存——就变成了三级缓存,即L3缓存

计算机中有很多子系统,您可以在它们之间放置缓存以提高性能。这是一个例子。我们有微处理器(计算机中最快的部分)。然后是L1缓存,它缓存L2缓存的数据,L2缓存又缓存主内存,主内存可以(也经常)用作硬盘CD-ROM等更慢外设的缓存。硬盘也用于缓存更慢的介质——您的互联网连接。

广告

浏览器缓存:用于频繁访问的数据

您的互联网连接是计算机中最慢的环节。因此,您的网络浏览器(Safari、Google Chrome 以及所有其他浏览器)使用硬盘来存储HTML页面,将它们放入磁盘上的一个特殊文件夹中。当您第一次请求一个HTML页面时,您的浏览器会渲染它,同时它的一个副本也会存储在您的磁盘上。

下次您请求访问此页面时,您的浏览器会检查互联网上文件的日期是否比缓存中的新。如果日期相同,您的浏览器将使用硬盘上的文件,而不是从互联网下载。在这种情况下,更小但更快的内存系统是您的硬盘,而更大更慢的内存系统是互联网。

广告

缓存也可以直接构建在外设上。现代硬盘配备了快速内存,大约512千字节,直接硬连接到硬盘上。计算机不直接使用此内存——硬盘控制器使用。对于计算机来说,这些内存芯片就是磁盘本身。

当计算机从硬盘请求数据时,硬盘控制器会在移动硬盘机械部件(与内存相比非常慢)之前检查此内存。如果在缓存中找到请求的数据,它将返回存储在缓存中的数据,而无需实际访问磁盘上的数据本身,从而节省大量时间。

广告

缓存数据的子系统

这里有一个您可以尝试的实验。您的计算机用主内存缓存您的软盘驱动器,您实际上可以看到它发生。从您的软盘访问一个大文件——例如,在文本编辑器中打开一个300千字节的文本文件。第一次,您会看到软盘灯亮起,并且您会等待。软盘非常慢,因此加载文件需要20秒。

现在,关闭编辑器并再次打开同一个文件。第二次(不要等待30分钟,也不要在两次尝试之间进行大量的磁盘访问)您将不会看到指示灯亮起,也不会等待。操作系统检查了其针对软盘的内存缓存,并找到了它要查找的内容。

广告

因此,无需等待20秒,数据在内存子系统中被发现,这比您第一次尝试时快得多(对软盘的一次访问需要120毫秒,而对主内存的一次访问大约需要60纳秒——这快得多)。您可以在硬盘上运行相同的测试,但在软盘驱动器上更明显,因为它太慢了。

为了让您对这一切有一个全面的了解,这里列出了一个正常缓存系统:

  • L1 缓存 - 以微处理器全速访问的缓存内存(10纳秒,大小为4千字节到16千字节)
  • L2 缓存 - SRAM 类型的缓存内存访问(大约20到30纳秒,大小为128千字节到512千字节)
  • 主内存 - RAM 类型的内存访问(大约60纳秒,大小为32兆字节到128兆字节)
  • 硬盘 - 机械式,慢速(大约12毫秒,大小为1千兆字节到10千兆字节)
  • 互联网 - 极慢(1秒到3天之间,大小不限)

如您所见,L1缓存缓存L2缓存的数据,L2缓存又缓存主内存,主内存又可以用来缓存磁盘子系统,等等。

广告

为什么数据缓存至关重要

此时一个常见的问题是:“为什么不让计算机的所有内存都以L1缓存相同的速度运行,这样就不需要缓存了呢?”这会奏效,但会非常昂贵。缓存背后的理念是利用少量昂贵的内存来加速大量较慢、较便宜的内存。

在设计计算机时,目标是让微处理器尽可能经济地以全速运行。一个500兆赫的芯片每秒经历5亿个周期(每两纳秒一个周期)。如果没有L1和L2缓存,访问主内存需要60纳秒,或者说大约浪费30个周期来访问内存。

广告

仔细想想,如此相对微小的内存量竟然能够最大限度地利用大得多的内存量,这真是不可思议。想想一个256千字节的L2缓存,它缓存了64兆字节的RAM。在这种情况下,256,000字节有效地缓存了64,000,000字节。为什么会这样呢?

在计算机科学中,我们有一个称为局部性原理的理论概念。它意味着在一个相当大的程序中,在任何给定时间只使用一小部分。尽管这看起来很奇怪,但局部性原理适用于绝大多数程序。即使可执行文件大小为10兆字节,在任何给定时间,该程序中只有少量字节在使用,并且它们的重复率非常高。在下一页,您将了解更多关于局部性原理的信息。

广告

局部性原理

让我们看看下面的伪代码,了解为什么局部性原理有效(参见C语言编程工作原理深入了解)

Output to screen « Enter a number  between 1 and 100 »
Read input from user
Put value from user in variable X
Put value 100 in variable Y
Put value 1 in variable Z
Loop Y number of time
   Divide Z by X
   If the remainder of the division = 0
      then output « Z is a multiple of X »
   Add 1 to Z
Return to loop
End

这个小程序要求用户输入一个1到100之间的数字。它读取用户输入的值。然后,程序将1到100之间的每个数字除以用户输入的数字。它检查余数是否为0(模运算)。如果是,程序将输出“Z是X的倍数”(例如,12是6的倍数),针对1到100之间的每个数字。然后程序结束。

广告

即使您对计算机编程了解不多,也很容易理解,在这个程序的11行中,循环部分(第7到9行)执行了100次。所有其他行只执行一次。由于缓存,第7到9行将运行得显著更快。

这个程序非常小,可以轻易地完全放入最小的L1缓存中,但假设这个程序非常大。结果仍然相同。当您编程时,大量操作发生在循环内部。一个文字处理器95%的时间都花在等待您的输入并将其显示在屏幕上。文字处理程序中的这一部分就在缓存中。

这种95%对5%的比例(大约)就是我们所说的局部性原理,这也是缓存如此高效工作的原因。这也是为什么如此小的缓存能够高效缓存如此大的内存系统的原因。您可以看到为什么在计算机的每个地方都使用最快的内存是不值得的。我们可以以一小部分成本实现95%的这种效率。

有关缓存和相关主题的更多信息,请查看下一页的链接。

广告

常见问题

缓存用于什么?
缓存通过将数据存储在临时位置以便更快地检索来提高系统性能。
内存中的缓存是什么?
内存缓存是一个将数据存储在计算机内存中的过程。通过这种方式,可以更快地检索频繁访问的数据。缓存内存存储在保留位置,以便比存储在磁盘或其他较慢的存储设备上更快地访问它。
缓存是什么以及它是如何工作的?
缓存是一种将数据存储在临时位置的技术,以便可以快速有效地访问它。缓存数据存储在一个易于访问且无需花费大量时间或精力即可检索的位置。

广告

加载中...