C语言 使用mmap和madvise处理大型页面

jk9hmnmh  于 2023-05-16  发布在  其他
关注(0)|答案(2)|浏览(134)

我想在Linux机器使用的hugepages上分配内存。我看到有两种方法可以做到这一点,使用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);

有人能解释一下两者之间的区别吗?

rqcrx0a6

rqcrx0a61#

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

  • madvise为与传递给它的区域相对应的所有内存Map设置一个标志,告诉khugepaged内核线程它可以考虑将所述Map提升到大页面。这只会在启用透明hugepage支持时起作用(透明hugepage支持的状态在/sys/kernel/mm/transparent_hugepage/enabled下可用),这在大多数发行版中都是如此,但在嵌入式系统上可能会被禁用。
  • mmap实际上将继续保留内核内部hugetlbfs挂载的页面,其状态可以在/sys/kernel/mm/hugepages下看到。有问题的页面需要在调用mmap时可用(参见/proc/meminfo中的HugePages_Free),否则mmap将失败。

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

pinkon5k

pinkon5k2#

mmap用于显式Hugepages,而madvise用于透明Hugepages。这是在linux上使用大页面的两种方式。虽然EHP预先保留在虚拟内存中,但THP不是

相关问题