如何使TLB与用户进程颠簸?

时间:2011-04-07 05:26:31

标签: architecture x86-64 tlb

我目前的工作需要在英特尔酷睿系列的CPU上产生指定数量的TLB未命中,但它并不顺利。我尝试过很多方法,但是所有方法都有很高的TLB命中率。有没有人知道有关x86 TLB如何工作的一些有用信息,或某些在用户进程中产生大量TLB未命中的方法?

1 个答案:

答案 0 :(得分:2)

TLB是CPU用来记住与虚拟地址关联的物理地址的缓存。虚拟地址空间被分成页面,每个页面通常为4KB。 TLB为每个可能的虚拟页面都有一个空间,其中包含与之关联的物理页面的地址。当您尝试访问尚未加载物理地址的页面时,会发生TLB未命中。因此,为了最大限度地减少遗漏,您需要最大化访问的不同页面的数量。

不幸的是,事情并非那么简单。简单的TLB未命中将从页表层次结构中读取条目以找到适当的物理地址。但是,只有当您访问具有物理地址的页面时,才会出现这种情况。操作系统将确定哪些虚拟地址具有哪些物理地址,如果您尝试从其他虚拟地址读取,则会导致页面错误。页面错误处理程序将终止您的程序以非法访问该页面或移动数据以将物理页面放入该虚拟地址。

导致尽可能多的TLB未命中的最佳方法是:

  1. 分配与操作系统允许的内存一样多的内存。您应该交替分配大小块,在分配另一个大块之后释放小块。这有望最大化碎片化,将你的记忆扩展到尽可能多的页面。
  2. 使用您分配的内存中使用的每个不同页面创建一个包含一个地址的列表。您还可以添加其他您知道可读的页面,例如包含代码的页面。
  3. 循环浏览此列表,从每个页面读取数据。由于操作系统需要释放物理页面以放入虚拟页面,它(希望)将使用先前与循环中其他页面关联的物理页面,从而导致最大数量的TLB未命中。
  4. 随着可用RAM变低,未命中数将增加,因为操作系统必须移动更多物理页面以满足您的程序需求,因此同时运行其他需要内存的进程是件好事。