一、关于Hugepage和hugetlb(transparent huge page) 当中涉及的概念:

  • 1、mmu ,memory management unit ,处理VA(virtual memory address) 到PA( physical memory address) 之间的转换,mmu是一张表,有虚拟内存到物理内存的对应关系,最核心的是Page Table(页表),每一个条目就是一个PTE(page table entry)。注意:MMU是硬件设备。

  • 2、PTE: 页表项(page table entry) 。

  • 3、TLB (Translation Lookaside Buffers)快表,MMU内部专用的存放页表的cache。mmu先在TLB当中进行查找,未命中再去外部查找,TLB是一个SRAM。

  • 4PGD(Page Global Directory)->PUD(Page Upper Directory)->PMD(Page Middle Directory)->PT(Page Table)

    ​ 在内存管理逻辑当中PGD中包含若干PUD的地址,PUD中包含若干PMD的地址,PMD中又包含若干PT的地址,此外每一个进程有一个自己的PGD,可以理解为PGD是进程级别的虚拟(物理)内存管理地址(此处涉及进程的虚拟内存结构)。

  • 5、page fault ,当cpu进行访问不存在或者说未分配的物理内存地址的时候,由mmu产生的异常(exception),此时如果出现了该类异常,则会由操作系统内核进行处理,是否地址位置、权限使用合法,合法则分配相应的物理内存。如果进程分配了4G虚拟内存,那么总来说一共会产生4*1024*1024KB/4KBpage fault。 如果是用hugepage 则只会产生4*1024MB/2MBpage fault

  • 6、malloc,glibc库当中的方法,本质是封装了brk方法和mmap方法。

  • 7、brk,用户申请内存方法,只申请虚拟内存(地址)。

  • 8、mmap,用户申请内存方法,可直接申请虚拟内存(地址),也可以通过MAP_POPULATE 的flag表示进行直接分配使用物理内存(地址)。

    说明:mmap函数的flag:MAP_HUGETLB -> 是指当中的advice ,函数 int madvise(void *addr, size_t length, int advice); advice 的类型如果设定为 MADV_HUGEPAGE则会使用透明大页的内存来进行地址分配。

  • 10、mlock ,用户申请内存方式之一,指定内存地址空间,直接分配物理内存(地址)。

  • 11、vma(virtual memory area),虚拟内存区域。

  • 12、buddy system, 是有关内存内存地址分配算法的一套系统算法。详见:buddy_system

二、linxu操作系统关键位置:

 1# cat /proc/meminfo | grep -i HugePage  
 2# 当前操作系统大页内存分配与使用情况。
 3
 4# echo 1024 > /proc/sys/vm/nr_hugepages 
 5# 控制分配1024大页内存出来,如果/proc/meminfo当中Hugepagesize: 2048kB 则会马上划分并占用1024*2048kB的内存出来。
 6
 7# cat /proc/PID/smaps   
 8# 该文件展示了一个进程的vma的内存相关结构,详见-》https://www.programmersought.com/article/81957428014/
 9
10# cat /sys/kernel/mm/transparent_hugepage/enabled
11# 当前透明大页(transparent huge page)是否进行自动分配。有3个策略(always,madvise,never) 
12- always始终使用透明大页进行分配
13- madvice则表示在内存分配过程当中针对函数madvise当中int advice的类型设定为MADV_HUGEPAGE的类型进行大页内存分配
14- never 永不使用自动的透明大页分配。