26

我想在 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);

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

4

1 回答 1

26

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

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

  • mmap实际上会继续保留内核内部hugetlbfs挂载的页面,其状态可以在/sys/kernel/mm/hugepages. mmap有问题的页面需要在被调用时可用(HugePages_Free参见参考资料/proc/meminfo),否则mmap将失败。

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

于 2015-05-27T04:48:56.207 回答