【问题标题】:TLB misses vs cache misses?TLB 未命中与缓存未命中?
【发布时间】:2012-05-13 20:22:23
【问题描述】:

有人能解释一下 TLB(翻译后备缓冲区)未命中和缓存未命中之间的区别吗?

我相信我发现 TLB 指的是某种虚拟内存地址,但我并不太清楚这实际上意味着什么?

我了解当内存块(缓存行的大小)加载到(L3?)缓存中并且当前缓存行中未保存所需地址时会导致缓存未命中 - 这是缓存未命中。

【问题讨论】:

标签: performance caching operating-system cpu-architecture tlb


【解决方案1】:

嗯,当今所有的现代操作系统都使用一种称为虚拟内存的东西。 CPU生成的每个地址都是虚拟的。存在将这种虚拟地址映射到物理地址的页表。而 TLB 只是页表条目的缓存。

另一方面,L1、L2、L3 缓存缓存主存内容。

当 CPU 请求的虚拟地址的 virtual memory address => physical memory address 映射不在 TLB 中时,会发生 TLB 未命中。然后必须将该条目从页表中提取到 TLB 中。

当 CPU 需要不在缓存中的内容时,就会发生缓存未命中。然后在主存储器 (RAM) 中查找数据。如果不存在,则必须从辅助内存(硬盘)中获取数据。

【讨论】:

  • 虚拟内存地址的用途是什么,它实际上指的是什么,仍然是主内存(RAM)?
  • 嗯,早期的 32 位 CPU 用于生成 32 位地址 ~4GB 的可寻址内存。但 RAM 量通常小于 4GB。现在,如果您有 1GB RAM,则无法运行需要超过 1GB 可寻址内存的程序。那么为什么不让程序相信你有 4GB 内存呢?只有一小部分程序数据位于 RAM 中,其余的位于硬盘驱动器中。这就是虚拟内存的作用。您可以在Wikipedia article 中阅读所有相关信息。当前的 64 位 CPU 也使用虚拟内存。现在只有虚拟地址长度为 48 位。
  • 页表和 TLB 是否也为缓存存储映射?还是只是主内存?
  • 同样,页表驻留在 RAM 中,因此可以被缓存。因此,TLB 未命中也可以访问缓存
【解决方案2】:

在PC中加载第一条指令地址(即虚拟地址)后的以下序列使TLB未命中和缓存未命中的概念非常清晰。

第一条指令 • 访问第一条指令

  • 拿启动电脑
  • 使用从 PC 中提取的 VPN 访问 iTLB:iTLBmiss
  • 调用 iTLBmiss 处理程序
  • 计算PTE地址
  • 如果 PTE 缓存在 L1 数据和 L2 缓存中,请使用 PTE 地址查找它们:您也会错过那里
  • 访问主内存中的页表:PTE 无效:页面错误
  • 调用页面错误处理程序
  • 分配页框,从磁盘读取页,更新 PTE,在 iTLB 中加载 PTE,重新开始 fetch • 现在您有了实际地址

  • 访问 Icache:未命中

  • 向更高级别发送补充请求:您到处都想念
  • 向内存控制器(北桥)发送请求
  • 访问主内存
  • 读取缓存行
  • 在缓存线返回处理器时重新填充所有级别的缓存
  • 从带有块偏移的缓存行中提取适当的指令 • 这是指令/数据访问中可能的最长延迟

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

【讨论】:

    【解决方案3】:

    提到了这两个过程的方式。就性能而言,缓存未命中不一定会使 CPU 停顿。使用算法预取技术可以容忍少量缓存未命中。然而,TLB 未命中会导致 CPU 停顿,直到 TLB 已用新地址更新。换句话说,预取可以屏蔽缓存未命中,但不能屏蔽 TLB 未命中。

    【讨论】:

    • 严格来说这不是真的。对于乱序执行和硬件页表遍历(x86、ARM、某些 MIPS 第 5 版等),TLB 未命中可能不会立即停止处理器。此外,学术论文提出了 TLB 的硬件预取。处理器也可以使用普通的内存预取指令预取 TLB 条目。
    猜你喜欢
    • 2011-03-16
    • 2011-11-23
    • 2012-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-24
    • 2015-06-09
    • 2021-05-30
    相关资源
    最近更新 更多