如果 TLB 都需要两次内存访问,那么是什么让 TLB 比 Page Table 更快?

What makes a TLB faster than a Page Table if they both require two memory accesses?

即将出发wikipedia:

The page table, generally stored in main memory, keeps track of where the virtual pages are stored in the physical memory. This method uses two memory accesses (one for the page table entry, one for the byte) to access a byte. First, the page table is looked up for the frame number. Second, the frame number with the page offset gives the actual address. Thus any straightforward virtual memory scheme would have the effect of doubling the memory access time. Hence, the TLB is used to reduce the time taken to access the memory locations in the page table method.

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

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

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

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

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

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

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

您可以阅读有关可寻址内存的内容here

这取决于具体的实现。一般来说,TLB是存在于CPU内的缓存。

You still need to access the TLB to find the physical address, and then once you have that, you still need to actually access the data at the physical address, which is two lookups just like with the page table.

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

我知道这个问题已经三年没问了,但由于它仍然是相关的,而且它仍然出现在搜索引擎中,我会尽力给出一个完整的答案。

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

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

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 内,而主内存 - 因此页面 table - 不在。
  2. TLB 与其他缓存一样,由快速且昂贵的 SRAM 构成,而主存储器通常由缓慢且廉价的 DRAM 构成(阅读更多 here)。

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

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

这才是问题的症结所在。

现代 CPU 倾向于使用 multilevel page tables in order to save memory. Most notably, x86-64 page tables currently consist of up to four levels (and a fifth may be coming)。这意味着 通过页面 table 访问内存中的单个字节需要最多五次内存访问 :页面 table 需要四次,数据需要一次。显然,如果没有 TLB,成本将高得无法承受;很容易看出为什么 CPU 和 OS 工程师付出很多努力来尽量减少 TLB 未命中的频率。

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

Page-table 访问可以并由现代 CPUs 上的数据缓存缓存,但页面遍历中的下一次访问取决于第一次访问的结果(指向页面的下一级 table),因此即使所有访问都命中 L1d 缓存,4 级页面遍历也会有大约 4x 4 周期 = 16 周期延迟。对于流水线而言,这比现代英特尔 CPU 中 L1d 缓存命中负载的一部分 ~3 到 4 个周期的 TLB 延迟要隐藏得多(当然,它使用 TLB 进行数据和指令访问)。

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

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

会有很多变化,因为今天的计算机首先会使用高级分页技术(多级、按需分页e.t.c)但这句话是一个 直观的解释 为什么 TLB 的想法比简单的页面更有帮助 table。

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