Linux内存管理 - 大页 (二)
为了解决页表项过多的问题, Linux提供了两种机制, 就是多级页表和大页。
一. 在阐述大页的优点之前, 先来看一下内存映射的页表结构。
PGD: Page Global Directory
PUD: Page Upper Directory
PMD: Page Middle Directory
PTE: Page Table Entry
二. TLB
TLB: Translation Lookaside Buffer 旁路转换缓冲, 或称为页表缓冲。 里面存放的是一些页表文件(虚拟地址到物理地址的转换表), 又称为快表技术
如果匹配到逻辑地址就可以迅速找到页框号, 通过页框号与逻辑地址的后12位的偏移得到最终的物理地址。 如果没有在TLB中匹配到逻辑地址, 就出现TLB不命中 (TLB Miss), 需要通过常规的页表查找, 如果TLB足够大, 那么这个转换就会变得迅速, 但是事实是TLB的容量非常小, 一般只有几十项到几百项不等。
举个例子, 假设一个应用程序需要使用8KB的物理内存, 如果使用常规4KB并且使TLB总能命中, 那么至少需要在TLB存放两个表项。 但是如果需要512个页, 那就需要512个表项, 但是TLB容量有限, 随着程序的变大和使用内存的增加, 势必会增加TLB的使用项, 最后导致TLB出现不命中的情况。
三. 大页的优点
- 降低TLB Miss的概率: 大页覆盖更大的连续虚拟地址范围, 使得CPU的TLB命中率大大提高, 减少了遍历页表以从虚拟地址获取物理地址的次数
- 减少walk page table的长度: 由于大页的页表级数比普通页面级数小1, 所以走表时会高效一些。
四. 大页的缺点
- 静态大页要预先分配并重启主机生效
- 如果分配不当, 有可能造成严重问题 (大页未能使用, 浪费内存;系统内存不足或者交换过多;极高的sys cpu使用率)
五. 大页的分类
- 静态大页(persistent hugepage): 通过用户自行控制它的分配, 释放, 使用。
- 透明大页 (transparent hugepage): 由系统自己控制透明大页的分配, 释放, 使用。 若用户开启透明大页功能, 系统会在后台运行一个khugepage的内核线程扫描系统内存, 将合适的内存合并成为大页, 用户无感。