zoukankan      html  css  js  c++  java
  • [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!
    ");
      getchar();
     
      munmap(m, s);
      return 0;
    }

    3.最后的话

    大页内存的好处不仅是减少TLB未命中次数,而且大页内存分配的是物理内存,不会被操作系统的内存管理换出到磁盘上,因此不会出现缺页中断,也就不会引入访问磁盘的时延,另外,大页内存在物理上是连续的,对于大内存访问也有一定的加速效果。

     

  • 相关阅读:
    spring
    google-c-style
    process想停就停,真爽
    mytop
    Java 图片设置圆角(设置边框,旁白)
    当setTimeout遇到闭包
    FreeMarker辅助
    ImageIO.wtrie生成jpg图片质量损失方案:BufferedImage生成jpg图片文件流
    从BufferedImage到InputStream,实现绘图后进行下载(生成二维码图片并下载)
    使用Javascript 实现类
  • 原文地址:https://www.cnblogs.com/burningTheStar/p/8039961.html
Copyright © 2011-2022 走看看