串行内存页面(虚拟内存)和TLB命中

问题描述 投票:0回答:1

在内存页面大小为 4096 字节的 Linux 中,我们使用

mmap
函数执行虚拟内存映射,假设我们请求 1048576 字节(1MB)。所以这里我们有 1048576 / 4096 个内存页(256 个内存页)。现在的问题是所有页面在物理内存中是否都是串行的(彼此靠近)?我想知道对于 1 MB 虚拟内存,通过访问其第一个字节,我们会获得其其他内存页面的首次
TLB
命中,或者每个内存页面 (4096) 可能不会在物理内存中串行且对于每个页面访问时,可能会有一个
TLB miss

简单来说,分配1MB虚拟内存(256个内存页)。第一次访问这个内存会是

TLB miss
,因为它的物理地址不存在于TLB中,所以最后会有一个
TLB hit
,但是之后通过访问这个虚拟内存的其他页面,我们是否有
TLB hit
没有
TLB miss
对于该内存的每个内存页面,或者每个页面可能存在于物理内存的随机位置,并且我们的内存页面不是串行的?

memory memory-management virtual-memory tlb
1个回答
0
投票

当然不能保证连续的虚拟页面将对应于连续的物理页面。 虚拟内存的主要优点之一是它避免了碎片问题 - 即使物理内存只有分散的可用页面,它们仍然可以映射到虚拟内存的连续区域。 提供连续物理页面的保证可以解决这个问题。

通常,您应该预料到第一次访问虚拟内存将导致每个页面发生 TLB 未命中和页表遍历,无论它们物理上是否连续。 在给定顺序访问模式的情况下,某些 CPU 可能能够预测序列中后面的页面也可能很快被访问,并尝试提前填充 TLB。 但如果是这样,我希望这基于页面的“虚拟”地址是否是连续的。 毕竟,程序会看到虚拟内存,因此当它们按顺序访问某个区域时,它将是连续的虚拟地址,因此我希望 CPU 能够针对这种情况进行优化。 如果您想要物理内存和虚拟内存中连续的大内存块,以最大限度地减少 TLB 未命中、页面错误等次数,那么您想要的是

大页

© www.soinside.com 2019 - 2024. All rights reserved.