TLB缺失与缓存缺失的区别?

26

能否有人解释一下TLB(翻译为“翻译后备缓存”)未命中和高速缓存未命中的区别呢?

我认为我已经知道TLB是指某种虚拟内存地址,但我不是很清楚这实际上是什么意思?

我了解到当一个内存块(与高速缓存线大小相同)被加载到(L3?)高速缓存中,并且如果所需地址不在当前高速缓存行内时,会发生缓存未命中。


1
了解分页https://dev59.com/7WMl5IYBdhLWcg3wZWSD#18431262,并查看TLB部分。 - Ciro Santilli OurBigBook.com
3个回答

33

现代操作系统都使用虚拟内存,CPU 生成的所有地址都是虚拟地址。有页表将这样的虚拟地址映射到物理地址。而 TLB 只是页表项的缓存。

另一方面,L1、L2、L3 缓存会缓存主存储器中的内容。

当 CPU 请求一个虚拟地址时,如果它在 TLB 中没有找到其对应的 虚拟内存地址 => 物理内存地址 映射,则会发生 TLB 缺失。此时必须将该页表项从页表中获取并装入 TLB。

当 CPU 需要的数据不在缓存中时,就会发生缓存未命中。数据随后将在主内存(RAM)中寻找。如果在 RAM 中也没有找到该数据,则必须从辅助存储器(硬盘)中获取。


虚拟内存地址的目的是什么?它实际上指的是什么,仍然是主内存(RAM)吗? - intrigued_66
6
早期32位的CPU生成32位地址,可以寻址大约4GB的内存空间。但是RAM的容量通常不足4GB。如果你只有1GB RAM,那么就不能运行需要超过1GB可寻址内存的程序。所以为什么不欺骗程序,让它认为你有4GB RAM?其中只有一部分程序数据在RAM中,其余数据在硬盘中。这就是虚拟内存的作用。你可以在这篇维基百科文章中了解更多相关信息:Wikipedia article。目前的64位CPU也使用虚拟内存,只不过虚拟地址长度现在变成了48位。 - Hindol
页面表和TLB是否也存储缓存的映射,还是只存储主内存的映射? - somenickname
再次强调,页表驻留在RAM中,因此可以被缓存。因此,TLB缺失也可以访问缓存。 - talekeDskobeDa

2
加载第一条指令地址(即虚拟地址)到 PC 后,以下序列使 TLB 未命中和缓存未命中的概念变得非常清晰。
第一条指令是: • 访问第一条指令。
  • 启动PC
  • 使用从PC提取的VPN访问iTLB:iTLBmiss
  • 调用iTLBmiss处理程序
  • 计算PTE地址
  • 如果PTE被缓存在L1数据和L2缓存中,请使用PTE地址查找它们:您也会在那里错过
  • 访问主内存中的页表:PTE无效:页面错误
  • 调用页面错误处理程序
  • 分配页面帧,从磁盘读取页面,更新PTE,将PTE加载到iTLB中,重新启动提取 •现在您有了物理地址

  • 访问Icache:未命中

  • 向更高级别发送填充请求:您无处不错过
  • 向内存控制器(北桥)发送请求
  • 访问主内存
  • 读取缓存行
  • 随着缓存行返回处理器,重新填充所有级别的缓存
  • 使用块偏移从缓存行中提取适当的指令 •这是指令/数据访问中最长的延迟时间
来源:

链接 https://software.intel.com/en-us/articles/recap-virtual-memory-and-cache


0

由于两个过程的“如何”都已经提到。就性能而言,缓存未命中并不一定会使CPU停顿。可以使用算法预取技术容忍少量的缓存未命中。然而,TLB未命中会导致CPU停顿,直到TLB已更新为新地址。换句话说,预取可以掩盖缓存未命中,但无法掩盖TLB未命中。


这并不是严格的真实情况。通过乱序执行和硬件页表遍历(x86、ARM、一些MIPS Release 5等),TLB未命中可能不会立即使处理器停顿。此外,学术论文已经提出了用于TLB的硬件预取技术。处理器也可以使用普通内存预取指令来预取TLB条目。 - user2467198

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