1. 程式人生 > 其它 >Linux申請大頁記憶體(mmap)

Linux申請大頁記憶體(mmap)


1.為什麼要使用大頁記憶體

  瞭解作業系統記憶體管理的人一般都知道作業系統對記憶體採用多級頁表和分頁進行管理,作業系統每個頁預設大小為4KB。如果程序使用的記憶體過大,比如1GB,這樣會在頁表中佔用 1GB / 4KB = 262144個頁表項,而系統TLB可以容納的頁表項遠小於這個數量。當多個記憶體密集型應用訪問記憶體時,會造成過多的TLB未命中,因此在特定情況下會需要減少未命中次數,一個可行的辦法就是增大每個頁的尺寸。作業系統預設支援的大頁是2MB,當使用1GB記憶體時,在頁表中將佔用 1GB / 2MB = 512個頁表項,可以大大提升TLB命中率,進而提升應用效能。


2.怎樣使用大頁記憶體

2.1 先預留一定量的大頁記憶體

#先檢視系統有多少已經預留的大頁記憶體
# cat /proc/meminfo |grep -i huge
#預留192個大頁
# sysctl vm.nr_hugepages=192
#檢視是否預留成功
# cat /proc/meminfo |grep -i huge

2.2 通過系統呼叫來從預留的大頁記憶體中申請大頁

#include <sys/mman.h>
#include <stdio.h>
#include <memory.h>
 
int main(int argc, char *argv[]) {
  char *m;
  size_t s = (8UL * 1024 * 1024);
 
  m = mmap(NULL, s, PROT_READ | PROT_WRITE,
                    MAP_PRIVATE | MAP_ANONYMOUS | 0x40000 /*MAP_HUGETLB*/, -1, 0);
  if (m == MAP_FAILED) {
    perror("map mem");
    m = NULL;
    return 1;
  }
 
  memset(m, 0, s);
 
  printf("map_hugetlb ok, press ENTER to quit!n");
  getchar();
 
  munmap(m, s);
  return 0;
}

3.最後的話

大頁記憶體的好處不僅是減少TLB未命中次數,而且大頁記憶體分配的是實體記憶體,不會被作業系統的記憶體管理換出到磁碟上,因此不會出現缺頁中斷,也就不會引入訪問磁碟的時延,另外,大頁記憶體在物理上是連續的,對於大記憶體訪問也有一定的加速效果。