我想在Linux机器使用的hugepages上分配内存。我看到有两种方法可以做到这一点,使用mmap
和madvise
。
也就是说,将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);
有人能解释一下两者之间的区别吗?
2条答案
按热度按时间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.txt和transhuge.txt
pinkon5k2#
mmap用于显式Hugepages,而madvise用于透明Hugepages。这是在linux上使用大页面的两种方式。虽然EHP预先保留在虚拟内存中,但THP不是