缓存未命中,TLB未命中和页面错误

49

有人能清楚地解释一下缓存未命中、TLB未命中和页面故障之间的区别,以及它们如何影响有效的内存访问时间吗?


如有任何疑问,请随时提出。 - Sumeet
1
为什么我们需要一个页表,为什么不能直接指向物理内存?@SumeetSingh - marsh
4
我推荐关注以下YouTuber的虚拟内存视频https://www.youtube.com/watch?v=qlH4-oHnBb8&t=1s。 - Sumeet
3
简而言之,虚拟内存的存在是为了让程序员不用关心实际的物理地址,因为他们需要关注算法或手头的问题。所以,让程序员在虚拟(而非真实)内存中编写代码,由内存管理单元处理转换。 - Sumeet
1
@marsh 为您添加了另一个答案。 - Sumeet
5个回答

65

让我逐步解释这些事情。

CPU生成逻辑地址,其中包含页面编号和页面偏移量。

页面编号用于索引页面表,获取相应的页面框架号,一旦我们有了物理内存(也称为主内存)的页面帧,就可以应用页面偏移量来获取正确的内存字。

为什么需要TLB(快表)

问题在于页面表存储在物理内存中,有时可能非常大,因此为了加速逻辑地址到物理地址的转换,我们有时会使用TLB(快表),它由昂贵且更快的关联内存制成。 因此,我们不是首先进入页面表,而是进入TLB并使用页面编号索引到TLB,获取相应的页面帧号,如果找到它,我们完全避免了页面表(因为我们同时拥有页面帧号和页面偏移量),形成物理地址。

TLB未命中

如果我们在TLB中找不到页面帧号,则称为TLB未命中,然后我们才去页面表查找相应的页面帧号。

TLB命中

如果我们在TLB中找到页面帧号,则称为TLB命中,我们不需要访问页面表。

页面错误

当运行程序访问的页面不在物理内存中时会发生缺页中断。这意味着该页面存在于辅助内存中,但尚未加载到物理内存的帧中。

高速缓存命中

高速缓存是一种小型内存,其操作速度比物理内存快,我们总是先访问高速缓存,而不是直接访问物理内存。如果我们能够在缓存内定位到对应的单词,则称其为高速缓存命中,此时我们甚至不需要访问物理内存。

高速缓存未命中

仅当映射到高速缓存无法在缓存内找到相应的(类似于物理内存页帧)时(称为高速缓存未命中),我们才会访问物理内存并完成访问页表TLB的过程。

因此,流程基本如下:

1。首先访问高速缓存,如果是高速缓存命中,则完成。

2。如果是高速缓存未命中,则进行第3步。

3。首先访问TLB,如果是TLB命中,则使用形成的物理地址访问物理内存,然后完成。

4。如果是TLB未命中,则访问页表以获取页面的帧号来形成物理地址

5。如果未找到页面,则出现页面故障。如果所有帧都被某些页面占用,则使用其中一个页面置换算法,否则只需将所需页面从辅助内存加载到物理内存帧中即可。

结语

我所讨论的流程与虚拟高速缓存(VIVT)有关(更快但不能在进程之间共享),如果是物理高速缓存(PIPT),则流程肯定会改变(更慢但可在进程之间共享)。高速缓存可以通过多种方式进行寻址。如果您愿意深入了解,请参考这篇文章这个视频


11
我认为流程有误。根据帕特森和亨尼西的《计算机组成与设计》,应该检查TLB以获取物理地址(其中包含物理地址标记和缓存索引),然后根据缓存索引和物理地址标记访问缓存。 - user1036719
@Summet Singh TLB很快,因此我认为它不会违反内存层次结构。 - user1036719
4
请查看Patterson和Hennesey的书中这张图片:http://harttle.com/assets/img/blog/tlb-cache.png。 - user1036719
2
“页面错误”是指当我们形成物理地址时,[...]在主存储器中找不到它。我认为这是错误的。页面错误是指当前虚拟地址未映射到物理地址。 - Zulan
为了更好的理解,我发现这篇文章(在我看来)清晰地解释了页面和页面帧的概念。基本上,页面是存储的数据,而页面帧是存储该数据的内存空间。(正如在此处提到的:https://qr.ae/pGgXL9)。 - Lennin
显示剩余11条评论

21
这张图表可以帮助你理解何时会出现缓存命中或未命中的情况。 在此输入图片描述

7

想象一下,有一个正在运行的进程需要一个数据项X。

首先,将检查缓存内存是否有所请求的数据项。如果有(缓存命中),则它将被返回。如果没有(缓存未命中),则将从主内存中加载。

如果缓存未命中,则会检查主内存以查看是否存在包含所请求数据项的页面 (页面命中),如果不存在该页面(页面错误),则必须从磁盘中将包含所需项的页面加载到主内存中。

处理页面错误时,将检查TLB以查看所需页面的帧号在那里是否可用 (TLB命中),否则(TLB未命中)操作系统必须查询页表以服务页面错误。

访问这些类型的内存所需的时间:

缓存 << 主内存 << 磁盘 enter image description here

缓存访问所需的时间最少,因此在某个级别上的命中或未命中会极大地改变有效访问时间。


7
引起页面错误的原因是什么?它总是因为内存已经被移动到硬盘上了吗?还是因为其他应用程序将其移动了位置?
嗯,这取决于具体情况。如果您的系统不支持多道程序设计(在多道程序设计系统中,有一个或多个程序加载到主存储器中,准备执行),那么肯定会发生页面错误,因为内存已经被移动到硬盘上了。
如果您的系统支持多道程序设计,那么这取决于您的操作系统是使用全局页面替换还是本地页面替换。如果使用全局页面替换,则可能会移动其他应用程序的内存。但是在本地页面替换中,内存已经移回硬盘。当进程遇到页面错误时,本地页面替换算法会选择替换属于同一进程的某个页面。另一方面,全局替换算法可以自由选择来自整个帧池的任何页面。当处理抖动时,这些讨论会更加频繁。
TLB未命中是指在TLB(转换后备缓冲区)中不存在所需的虚拟地址到物理地址转换的页表项。TLB类似于缓存,但它不存储数据,而是存储页表项,以便在TLB命中的情况下可以完全绕过页表,如图所示。

enter image description here

页面错误是崩溃吗?还是和TLB缺失一样?

两者都不是崩溃,因为崩溃是无法恢复的。但是众所周知,我们可以在不需要中止进程执行的情况下从页面错误和TLB缺失中恢复。


-2
操作系统使用虚拟内存和页表将这些虚拟地址映射到物理地址。TLB作为此类映射的缓存。
 program >>> TLB >>> cache >>> Ram

一个程序在TLB中搜索页面,如果没有找到该页面,则会出现TLB缺失,并进一步在高速缓存中查找该页面。
如果页面不在缓存中,则会出现缓存缺失,并进一步在RAM中查找该页面。
如果页面不在RAM中,则会出现页面错误,并且程序将在二级存储器中查找数据。
因此,典型的流程如下:
Page Requested >> TLB miss >> cache miss >> page fault >> looks in secondary memory. 

TLB 存储物理地址,而 Cache 存储单词。 - Tony Stark

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接