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的内核线程扫描系统内存, 将合适的内存合并成为大页, 用户无感。 
posted @ 2023-07-17 17:25  球球小世界  阅读(181)  评论(0编辑  收藏  举报