有人能清楚地解释一下缓存未命中、TLB未命中和页面故障之间的区别,以及它们如何影响有效的内存访问时间吗?
有人能清楚地解释一下缓存未命中、TLB未命中和页面故障之间的区别,以及它们如何影响有效的内存访问时间吗?
让我逐步解释这些事情。
CPU生成逻辑地址,其中包含页面编号和页面偏移量。
页面编号用于索引页面表,获取相应的页面框架号,一旦我们有了物理内存(也称为主内存)的页面帧,就可以应用页面偏移量来获取正确的内存字。
为什么需要TLB(快表)
问题在于页面表存储在物理内存中,有时可能非常大,因此为了加速逻辑地址到物理地址的转换,我们有时会使用TLB(快表)
,它由昂贵且更快的关联内存制成。 因此,我们不是首先进入页面表,而是进入TLB
并使用页面编号索引到TLB
,获取相应的页面帧号,如果找到它,我们完全避免了页面表
(因为我们同时拥有页面帧号和页面偏移量),形成物理地址。
TLB未命中
如果我们在TLB
中找不到页面帧号,则称为TLB未命中
,然后我们才去页面表
查找相应的页面帧号。
TLB命中
如果我们在TLB
中找到页面帧号,则称为TLB命中
,我们不需要访问页面表。
页面错误
当运行程序访问的页面不在物理内存中时会发生缺页中断。这意味着该页面存在于辅助内存中,但尚未加载到物理内存的帧中。
高速缓存命中
高速缓存是一种小型内存,其操作速度比物理内存快,我们总是先访问高速缓存,而不是直接访问物理内存。如果我们能够在缓存内定位到对应的单词,则称其为高速缓存命中
,此时我们甚至不需要访问物理内存。
高速缓存未命中
仅当映射到高速缓存
无法在缓存内找到相应的块
(类似于物理内存页帧
)时(称为高速缓存未命中
),我们才会访问物理内存
并完成访问页表
或TLB
的过程。
因此,流程基本如下:
1。首先访问高速缓存
,如果是高速缓存命中
,则完成。
2。如果是高速缓存未命中
,则进行第3步。
3。首先访问TLB
,如果是TLB命中
,则使用形成的物理地址
访问物理内存,然后完成。
4。如果是TLB未命中
,则访问页表
以获取页面的帧号来形成物理地址
。
5。如果未找到页面
,则出现页面故障
。如果所有帧都被某些页面占用,则使用其中一个页面置换算法
,否则只需将所需页面从辅助内存
加载到物理内存
帧中即可。
结语
我所讨论的流程与虚拟高速缓存(VIVT)有关(更快但不能在进程之间共享),如果是物理高速缓存(PIPT),则流程肯定会改变(更慢但可在进程之间共享)。高速缓存可以通过多种方式进行寻址。如果您愿意深入了解,请参考这篇文章和这个视频。
想象一下,有一个正在运行的进程需要一个数据项X。
首先,将检查缓存内存是否有所请求的数据项。如果有(缓存命中),则它将被返回。如果没有(缓存未命中),则将从主内存中加载。
如果缓存未命中,则会检查主内存以查看是否存在包含所请求数据项的页面 (页面命中),如果不存在该页面(页面错误),则必须从磁盘中将包含所需项的页面加载到主内存中。
处理页面错误时,将检查TLB以查看所需页面的帧号在那里是否可用 (TLB命中),否则(TLB未命中)操作系统必须查询页表以服务页面错误。
访问这些类型的内存所需的时间:
缓存访问所需的时间最少,因此在某个级别上的命中或未命中会极大地改变有效访问时间。
页面错误是崩溃吗?还是和TLB缺失一样?
两者都不是崩溃,因为崩溃是无法恢复的。但是众所周知,我们可以在不需要中止进程执行的情况下从页面错误和TLB缺失中恢复。
program >>> TLB >>> cache >>> Ram
Page Requested >> TLB miss >> cache miss >> page fault >> looks in secondary memory.