📜  分页中的翻译后备缓冲区 (TLB)

📅  最后修改于: 2021-09-28 10:00:12             🧑  作者: Mango

在操作系统(内存管理技术:分页)中,将为每个进程创建页表,其中将包含页表条目(PTE)。该 PTE 将包含诸如帧号(我们要引用的主存储器地址)和一些其他有用位(例如,有效/无效位、脏位、保护位等)等信息。这个页表条目 (PTE) 将告诉实际页面驻留在主内存中的哪个位置。

现在的问题是把页表放在哪里,这样总体访问时间(或引用时间)会更少。

最初的问题是根据 CPU 生成的地址(即逻辑/虚拟地址)快速访问主内存内容。最初,有人想到用寄存器来存储页表,因为它们是高速内存,所以访问时间会更少。

这里使用的想法是,将页表条目放在寄存器中,对于从 CPU(虚拟地址)产生的每个请求,它将与页表的适当页号进行匹配,现在它将告诉对应的主内存中的哪个位置页面驻留。一切似乎都在这里,但问题是寄存器大小很小(实际上,它最多可以容纳 0.5k 到 1k 页表条目)并且进程大小可能很大,因此所需的页表也会很大(假设这个页面table 包含 1M 个条目),因此寄存器可能无法保存页表的所有 PTE。所以这不是一个实用的方法。

为了克服这个大小问题,整个页表都保存在主内存中。但这里的问题是需要两个主要的内存引用:

  1. 查找帧数
  2. 转到帧号指定的地址

为了克服这个问题,我们为页表条目设置了一个高速缓存,称为转换后备缓冲区 (TLB)。 Translation Lookaside Buffer (TLB) 只不过是一种特殊的缓存,用于跟踪最近使用的事务。 TLB 包含最近使用过的页表条目。给定一个虚拟地址,如果存在页表条目(TLB 命中),则处理器检查 TLB,检索帧号并形成实际地址。如果在 TLB 中找不到页表条目(TLB 未命中),则在处理页表时将页号用作索引。 TLB 首先检查页面是否已经在主内存中,如果不在主内存中,则发出页面错误,然后更新 TLB 以包含新页面条目。

TLB 中的步骤命中:

  1. CPU 生成虚拟(逻辑)地址。
  2. 它在 TLB(当前)中检查。
  3. 检索相应的帧号,现在它告诉主内存页面位于何处。

TLB 未命中步骤:

  1. CPU 生成虚拟(逻辑)地址。
  2. 它在 TLB 中检查(不存在)。
  3. 现在页码与驻留在主内存中的页表匹配(假设页表包含所有 PTE)。
  4. 检索相应的帧号,现在它告诉主内存页面位于何处。
  5. TLB 用新的 PTE 更新(如果没有空间,则使用一种替换技术,即 FIFO、LRU 或 MFU 等)。

有效内存访问时间(EMAT): TLB 用于减少有效内存访问时间,因为它是一种高速关联缓存。
EMAT = h*(c+m) + (1-h)*(c+2m)
其中,h = TLB 的命中率
m = 内存访问时间
c = TLB 访问时间