一尘不染

对大型页面使用mmap和madvise

linux

我想在Linux机器正在使用的巨大页面上分配内存。我看到有两种方法可以使用mmapmadvise

也就是说,MAP_HUGETLBmmap调用中使用标志-

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);

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


阅读 1636

收藏
2020-06-07

共1个答案

一尘不染

这两个函数执行不同的操作,在您的上下文中这可能无关紧要:

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

  • mmap实际上将继续并保留内核内部hugetlbfs装载中的页面,其状态可以在中查看/sys/kernel/mm/hugepages。由时间问题所需要的页面,可mmap调用(见HugePages_Free/proc/meminfo),或mmap将失败。

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

2020-06-07