【问题标题】:What makes a TLB faster than a Page Table if they both require two memory accesses?如果 TLB 都需要两次内存访问,是什么让 TLB 比页表更快?
【发布时间】:2017-05-01 14:05:29
【问题描述】:

刚刚离开wikipedia

通常存储在主内存中的页表跟踪虚拟页面在物理内存中的存储位置。此方法使用两次内存访问(一次用于页表条目,一次用于字节)来访问一个字节。首先,在页表中查找帧号。其次,带有页偏移的帧号给出了实际地址。因此,任何直接的虚拟内存方案都会使内存访问时间加倍。因此,TLB用于减少页表方法中访问内存位置所花费的时间。

因此,我很好奇为什么 TLB 实际上更快,因为据我所知,它只是页表的一个更小、更精确的副本。

你仍然需要访问 TLB 来找到物理地址,然后一旦你有了它,你仍然需要实际访问物理地址处的数据,这就像页表一样是两次查找。

我只能想到 TLB 更快的两个原因:

  • 在 TLB 或页表中查找地址不是 O(n)(我假设它像哈希表一样是 O(1))。因此,由于 TLB 小得多,因此查找速度更快。同样在这种情况下,为什么不直接使用哈希表而不是 TLB?

  • 我错误地解释了 TLB 的工作原理,它实际上并没有进行两次访问。

【问题讨论】:

  • 如有任何疑问,请随时咨询。
  • 由于现代 CPU 中的多级分页,读取页表需要一次内存访问的假设是不正确的(请参阅我的答案)。

标签: memory operating-system cpu-architecture paging tlb


【解决方案1】:

您的假设是正确的,即使用 TLB 的方法仍然需要 2 次访问。但是使用 TLB 的方法更快,因为:

TLB 由速度更快的内存组成,称为关联内存

通常我们对物理内存进行 2 次内存访问,但使用 TLB 时有 1 次访问 TLB,其他访问是物理内存。

关联存储器更快,因为它是内容可寻址存储器,但它也昂贵,因为需要额外的逻辑电路。

您可以阅读内容可寻址内存here

【讨论】:

  • 这个答案具有误导性并且部分不正确,它回答了一个完全不同的问题(“为什么 TLB 访问时间是常数?”)。使 TLB 比主存更快的不是内容寻址能力——这意味着访问时间是恒定的,这对主存也是如此。此外,由于多级分页,在这两种情况下都需要两次内存访问的假设是正确的(请参阅我的回答)。
  • 我不会说“通常”。是否有任何现实世界的 CPU 设计具有分页虚拟内存没有至少一个微小的 TLB,比如至少 1 个条目?我不认为这就是你的意思,但更好的措辞可能是“没有 TLB,我们必须为每次加载、存储和代码获取遍历页表(通过 L1d 缓存访问),需要 2 到 4每个架构内存访问的额外访问次数”。
【解决方案2】:

这取决于具体的实现。通常,TLB 是存在于 CPU 中的缓存。

你仍然需要访问 TLB 来找到物理地址,然后一旦你有了它,你仍然需要实际访问物理地址处的数据,这就像页表一样是两次查找。

CPU 访问缓存的速度比它通过内存总线访问数据的速度要快得多。它对两个不同的地方进行两次访问(一个更快,一个更慢)。此外,内存位置也可以缓存在 CPU 中,在这种情况下,不需要通过内存总线进行访问。

【讨论】:

  • +1 用于提及缓存。除此之外,答案是不完整的,并且缺少现代 CPU 使用多级分页的事实(请参阅我的答案),这意味着读取页表需要多次内存访问,而不仅仅是一次。
【解决方案3】:

我知道这个问题被问到已经三年了,但由于它仍然具有相关性,并且仍然出现在搜索引擎中,所以我会尽力提供一个完整的答案。

通过 TLB 而不是页表访问主存更快,主要有两个原因:

1. TLB 比主内存(页表所在的位置)快。

The typical access time is in the order of <1 ns for the TLB and 100 ns for main memory
TLB 访问是 L1 缓存命中的一部分,modern CPUs can do 2 loads per clock 如果它们都命中 L1d 缓存。

原因有两个:

  1. TLB 位于 CPU 内,而主内存(因此页表)不在。
  2. TLB - 与其他缓存一样 - 由快速且昂贵的 SRAM 组成,而主存储器通常由速度慢且便宜的 DRAM 组成(阅读更多 here)。

因此,如果 TLB 和页表都只需要一次内存访问的假设是正确的,那么粗略地说,TLB 命中仍然会使内存访问时间减半。然而,正如我们接下来将看到的,这个假设是正确的,拥有 TLB 的好处更大。

2。访问页表通常需要多次内存访问。

这确实是问题的症结所在。

现代 CPU 倾向于使用multilevel page tables 来节省内存。最值得注意的是,x86-64 页表目前最多包含 四个 级别 (and a fifth may be coming)。这意味着通过页表访问内存中的单个字节需要最多五次内存访问:四次用于页表,一次用于数据。显然,如果没有 TLB,成本将高得难以承受;很容易看出为什么 CPU 和 OS 工程师付出了很多努力来最小化 TLB 未命中的频率。

最后,请注意,即使是这种解释也有些简化,因为它忽略了数据缓存等。现代台式机 CPU 的详细机制是复杂的,并且在一定程度上是未公开的。有关该主题的更详细讨论,请参阅 this thread,例如。

页表访问可以并且被现代 CPU 上的数据缓存缓存,但是页面遍历中的下一次访问取决于第一次访问的结果(指向下一级页表的指针),因此即使所有访问都在 L1d 缓存中命中,4 级页面遍历也会有大约 4x 4 周期 = 16 周期延迟。与现代 Intel CPU(当然使用 TLB 进行数据和指令访问)中 L1d 高速缓存命中负载的约 3 到 4 个周期 TLB 延迟相比,这对于管道来说要隐藏的更多。

【讨论】:

  • 实际上,TLB 是a fast CAM,通常与 L1 缓存并行访问(同时从集合中获取标签/数据)。 VIPT Cache: Connection between TLB & Cache?。这就是现代微架构在 dTLB 和 L1d 缓存中命中时每个时钟周期可以运行 2 次负载的方式。
【解决方案4】:

我认为@ihohen 说得差不多了,但是作为学生对未来的学生可能会来这里,简单的解释是:
" 如果在单级分页中没有 TLB,您需要 2 次访问主内存:
1 用于在页表(放置在主内存中)中查找逻辑地址的转换 还有 1 个用于实际访问内存块“。
现在使用 TLB ,您将上述内容仅减少为一次访问(第二次),因为查找翻译的步骤(希望)将在不需要访问主内存的情况下发生,因为您会在放置在 cpu 中的 TLB 中找到翻译”。

所以当我们说 TLB 将访问时间减少了 2 时,我们的意思是 大约如果我们忽略 TLB 未命中的情况,并考虑最简单的分页模型(单级)可以公平地说,TLB 将处理速度提高了 2 倍。

会有很多变化,因为今天的计算机首先会使用先进的分页技术(多级、按需分页等)但是这句话是 直观的解释,说明为什么 TLB 的想法比简单的页表更有帮助。

Silberschatz 的“操作系统”一书指出了另一种(更详细一点的)数学类型,用于使用 TLB 测量访问时间:
考虑:
h : TLB 命中率
τ : 访问主存的时间
e : 搜索 TLB 注册所花费的时间
t = h * (e + τ) + (1-h)*(e + 2τ)

【讨论】:

    猜你喜欢
    • 2014-04-15
    • 2012-03-07
    • 2011-04-14
    • 2014-10-08
    • 2012-09-23
    • 2016-08-11
    • 2017-08-03
    • 2013-03-15
    • 2020-07-25
    相关资源
    最近更新 更多