简单解释
当一个程序使用memory时,CPU将对应的RAM标记为被此程序所用。
为了效率,CPU以4K byte的单位分配RAM。此单位被称为"page"。
因为程序使用的内存空间是虚拟的,所以CPU需要记住哪个page属于哪个程序,以及page放在哪里。显而易见,page越多,要记的东西就越多,查起来也更费时间。
假设一个程序使用1GB内存,那就有1GB/4K=262144个page table entries。假设一个Page Table Entry消耗8byte,则就有262144*8byte=2MB的数据要查。
因此目前大部分CPU架构支持更大的page,以让内存查找更方便。
这种技术称为Huge pages(on Linux),Super pages(on BSD),Large pages(on Windows)。
较详细的解释
由于虚拟内存到物理内存之间的translation的存在,虚拟内存引用需要多次访问物理内存。而引用的成本与Page Table Format有关。为了降低translation的成本,虚拟内存中使用了“局部性原则(locality)”,只将最近的几次translation存储在名为“Translation Lookaside Buffer”的cache中。
有了TLB后,translation的步骤如下:
- CPU产生一个虚拟地址
- MMU从TLB中获取页表,翻译成物理地址
- MMU把物理地址发送给 L1 cache/L2 cache/L3 cache/memory
- L1/L2/L3/memory将地址对应数据返回给CPU
TLB能为多大的内存空间提供查询(称为TLB reach),取决于page size,number of TLB entries。
不可避免地,程序运行的一部分时间,被花在访问TLB和处理TLB misses上。
Translation花费的时间,取决于工作负载。如TLB reach是否可以满足application进行translation需要的内存空间大小。
而在TLB miss时,花费的时间取决于tanslation所需的信息是否在cache中。
如果通过分析程序运行花费的时间,得出TLB miss time占了较大的部分,那就应该考虑如何降低miss rate以取得更好的性能。一种方式就是扩大page size。
Huge page的优点有2点,明显的是translation的次数更少了,不明显的是TLB可以被放在L2 cached中了。
网友评论