我目前的工作需要在英特尔酷睿系列的 CPU 上生成指定数量的 TLB 未命中,但进展并不顺利。我尝试了很多方法,但它们的 TLB 命中率都很高。有谁知道一些关于 x86 TLB 如何工作的有用信息,或者一些在用户进程中生成大量 TLB 未命中的方法?
问问题
2171 次
1 回答
5
TLB 是 CPU 用来记住与虚拟地址关联的物理地址的高速缓存。虚拟地址空间被分成页面,通常每页 4KB。TLB 为每个可能的虚拟页面都有一个空间,其中包含与其关联的物理页面的地址。当您尝试访问其物理地址尚未加载的页面时,会发生 TLB 未命中。因此,为了最大化未命中,您需要最大化访问的不同页面的数量。
不幸的是,事情并没有那么简单。一个简单的 TLB 未命中将从页表层次结构中读取条目以找到正确的物理地址。但这仅在您访问具有物理地址的页面时才会发生。操作系统将确定哪些虚拟地址具有哪些物理地址,如果您尝试从任何其他地址读取,则会导致页面错误。页面错误处理程序将终止您的程序以非法访问该页面或移动数据以将物理页面放置在该虚拟地址中。
导致尽可能多的 TLB 未命中的最佳方法是:
- 在操作系统允许的范围内分配尽可能多的内存。您应该交替分配大块和小块,在分配另一个大块后释放小块。这将有望最大化碎片化,将您的记忆分散到尽可能多的页面上。
- 创建一个列表,其中包含您分配的内存中使用的每个不同页面的一个地址。您还可以添加您知道可读的其他页面,例如包含您的代码的页面。
- 循环遍历这个列表,从每一页读取数据。由于操作系统需要释放物理页面以放入您的虚拟页面,它会(希望)使用之前与循环中其他页面关联的物理页面,从而导致最大数量的 TLB 未命中。
随着可用 RAM 变低,未命中的数量会增加,因为操作系统将不得不移动更多的物理页面以满足程序的需求,因此最好同时运行其他占用大量内存的进程。
于 2011-04-07T05:46:39.510 回答