前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Linux申请大页内存(mmap)

Linux申请大页内存(mmap)

作者头像
昊楠Hacking
发布2018-03-08 14:54:23
11.8K0
发布2018-03-08 14:54:23
举报

1.为什么要使用大页内存

  了解操作系统内存管理的人一般都知道操作系统对内存采用多级页表和分页进行管理,操作系统每个页默认大小为4KB。如果进程使用的内存过大,比如1GB,这样会在页表中占用 1GB / 4KB = 262144个页表项,而系统TLB可以容纳的页表项远小于这个数量。当多个内存密集型应用访问内存时,会造成过多的TLB未命中,因此在特定情况下会需要减少未命中次数,一个可行的办法就是增大每个页的尺寸。操作系统默认支持的大页是2MB,当使用1GB内存时,在页表中将占用 1GB / 2MB = 512个页表项,可以大大提升TLB命中率,进而提升应用性能。


2.怎样使用大页内存

2.1 先预留一定量的大页内存

代码语言:javascript
复制
#先查看系统有多少已经预留的大页内存
# cat /proc/meminfo |grep -i huge
#预留192个大页
# sysctl vm.nr_hugepages=192
#查看是否预留成功
# cat /proc/meminfo |grep -i huge

2.2 通过系统调用来从预留的大页内存中申请大页

代码语言:javascript
复制
#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未命中次数,而且大页内存分配的是物理内存,不会被操作系统的内存管理换出到磁盘上,因此不会出现缺页中断,也就不会引入访问磁盘的时延,另外,大页内存在物理上是连续的,对于大内存访问也有一定的加速效果。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2017-12-14 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1.为什么要使用大页内存
  • 2.怎样使用大页内存
    • 2.1 先预留一定量的大页内存
      • 2.2 通过系统调用来从预留的大页内存中申请大页
        • 3.最后的话
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档