有人可以清楚地解释一下缓存未命中,tlb未命中和页面错误之间的区别,以及它们如何影响有效的内存访问时间?
答案 0 :(得分:21)
让我一步一步地解释所有这些事情。
CPU生成逻辑地址,其中包含page number
和page offset
。
page number
用于索引page table
,以获取相应的page frame number
,并且一旦我们拥有physical memory
的页面框架(也称为主内存) ),我们可以应用page offset
来获得正确的记忆词。
为什么TLB(翻译外观缓冲区)
问题是页面表存储在physical memory
中,有时可能非常大,所以为了加快逻辑地址到物理地址的转换,我们有时会使用{{ 1}},由昂贵且速度更快的联想内存组成,因此我们不是先进入页面表,而是进入TLB
并使用TLB
索引到page number
,并获取相应的TLB
,如果找到,我们会完全避免page frame number
(因为我们同时拥有page table
和page frame number
)和表单page offset
。
TLB Miss
如果我们在physical address
内找不到page frame number
,则会将其称为TLB
,然后我们会转到TLB miss
寻找相应的page table
。
TLB点击
如果我们在page frame number
中找到page frame number
,其名为TLB
,我们就不需要转到页面表。
Page Fault
在物理内存中不存在正在运行的程序访问的页面时发生。这意味着页面存在于辅助存储器中但尚未加载到物理存储器帧中。
缓存点击
高速缓冲存储器是一种小型存储器,其运行速度比物理存储器快,我们总是在进入物理存储器之前进行高速缓存。如果我们能够在缓存内的缓存内存中找到相应的单词,则称其为TLB hit
,我们甚至不需要转到物理内存。
缓存失踪
仅在映射到cache hit
无法在缓存内找到相应的cache memory
(block
类似于物理内存block
)内存之后(称为{{ 1}}),然后我们转到page frame
并执行所有审核cache miss
或physical memory
的过程。
所以流程基本上就是这个
1 。首先转到page table
,如果是TLB
,那么我们就完成了。
<强> 2 即可。如果是cache memory
,请转到第3步。
第3 即可。首先转到cache hit
,如果它是cache miss
,使用TLB
形成转到物理内存,我们就完成了。
<强> 4 即可。如果是TLB hit
,请转到physical address
以获取用于形成TLB miss
的网页的帧编号。
<强> 5 即可。如果找不到page table
,则为physical address
。如果所有帧都被某个页面占用,请使用其中一个page
,只需从page fault
加载所需的页面即可page replacement algorithms
框架。
结束注释
我讨论的流程与虚拟缓存相关(流程之间更快但不可共享),在物理缓存的情况下,流量肯定会发生变化(速度较慢但可以在进程之间共享)。可以通过多种方式处理缓存。如果您愿意深入了解,请查看this和this。
答案 1 :(得分:5)
想象一下一个进程正在运行,需要一个数据项X.
首先检查缓存内存是否有所请求的数据项,如果有(缓存命中),它将被返回。如果它不存在(缓存未命中),它将从主存储器加载。
如果存在缓存未命中,将检查主内存,以查看是否page包含所请求的数据项(页面点击)以及此页面是否存在(页面错误),包含所需项目的页面必须从磁盘进入主内存。
在处理页面错误时,将检查TLB以查看所需页面的帧编号是否可用( TLB命中)否则( TLB未命中)操作系统必须咨询用于处理页面错误的页面表。
访问这些类型记忆所需的时间:
缓存访问需要的时间最少,因此某个级别的命中或未命中会大大改变有效访问时间。
答案 2 :(得分:5)
导致页面错误的原因是什么?它总是因为记忆已经存在 搬到了硬盘?或者只是转移到其他应用程序?
嗯,这取决于。如果您的系统不支持multiprogramming(在多道程序设计系统中,主内存中有一个或多个程序已准备好执行),那么肯定是页面由于内存已移至硬盘,因此发生了故障。
如果您的系统支持多道程序设计,则取决于您的操作系统是使用全局页面替换还是本地页面替换。如果它使用全局,则是有可能内存已被移动以用于其他应用程序。但在本地,内存已被移回硬盘。当进程发生页面错误时,本地页面替换算法会选择替换某个属于同一进程的页面。另一方面,全局替换算法可以从整个帧池中自由选择任何页面。在处理thrashing时,有关这些问题的讨论会更多。
我对TLB未命中和页面错误之间的区别感到困惑。
当TLB(转换后备缓冲区)中不存在将虚拟地址转换为物理地址所需的页表条目时,会发生TLB未命中。 TLB就像一个缓存,但它不存储数据,而是存储页面表条目,这样我们就可以在TLB命中的情况下完全绕过页表,如图所示。
页面错误是否崩溃?或者它与TLB未命中相同?
由于崩溃无法恢复,因此它们都不会崩溃。但众所周知,我们可以从页面错误和TLB未命中恢复,而无需中止流程执行。
答案 3 :(得分:2)
答案 4 :(得分:-1)
操作系统使用虚拟内存和页表将这些虚拟地址映射到物理地址。 TLB用作此类映射的缓存。
In [31]: a = np.array([1, 2])
In [32]: a1 = a.copy()
In [33]: a2 = np.array(a)
In [34]: a[0] = 99
In [35]: a1
Out[35]: array([1, 2])
In [36]: a2
Out[36]: array([1, 2])
程序搜索TLB中的页面,如果找不到该页面则是TLB未命中,然后进一步查找缓存中的页面。
如果页面不在缓存中,则表示缓存未命中,并进一步查找RAM中的页面。
如果页面不在RAM中,那么这是页面错误,程序会在二级存储中查找数据。
所以,典型的流程是
program >>> TLB >>> cache >>> Ram