使用mmap和madvise用于大页面

时间:2015-05-26 23:59:00

标签: c linux memory-management mmap huge-pages

我想在Linux机器使用的大页面上分配内存。我发现使用mmapmadvise有两种方法可以做到这一点。

即,使用MAP_HUGETLB标记和mmap调用 -

base_ptr_ = mmap(NULL, memory_size_, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS | MAP_HUGETLB, -1, 0);

带有MADV_HUGEPAGE电话的madvise标志 -

madvise(base_ptr_, memory_size_, MADV_HUGEPAGE);

有人可以解释两者之间的区别吗?

1 个答案:

答案 0 :(得分:15)

这两个函数执行不同的操作,这些操作在您的上下文中可能会或可能不重要:

  • madvise为传递给它的区域对应的所有内存映射设置一个标志,告诉khugepaged内核线程它可以考虑将所述映射用于升级到大页面。只有在启用了透明的大页面支持(/sys/kernel/mm/transparent_hugepage/enabled下可以使用透明巨页支持的状态)时才能使用,这在大多数发行版中都是这种情况,但可以在嵌入式系统上禁用。

  • mmap实际上会继续保留内核hugetlbfs装载的页面,其状态可以在/sys/kernel/mm/hugepages下看到。相关网页需要在mmap被调用时提供(请参阅HugePages_Free中的/proc/meminfo),否则mmap将失败。

这两种机制在内核树中有自己的doc文件:hugetlbpage.txttranshuge.txt