我想在Linux机器正在使用的巨大页面上分配内存。我看到有两种方法可以使用mmap和madvise。
mmap
madvise
也就是说,MAP_HUGETLB在mmap调用中使用标志-
MAP_HUGETLB
base_ptr_ = mmap(NULL, memory_size_, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS | MAP_HUGETLB, -1, 0);
和MADV_HUGEPAGE带有madvise呼叫标志-
MADV_HUGEPAGE
madvise(base_ptr_, memory_size_, MADV_HUGEPAGE);
有人可以解释两者之间的区别吗?
这两个函数执行不同的操作,在您的上下文中这可能无关紧要:
madvise为所有与传递给它的区域相对应的内存映射设置一个标志,告诉khugepaged内核线程可以考虑将所述映射提升为大页面。只有启用了透明大页面支持(在下提供了透明大页面支持的状态),这才起作用。/sys/kernel/mm/transparent_hugepage/enabled在大多数发行版中都是这种情况,但是在嵌入式系统上可能会禁用。
khugepaged
/sys/kernel/mm/transparent_hugepage/enabled
mmap实际上将继续并保留内核内部hugetlbfs装载中的页面,其状态可以在中查看/sys/kernel/mm/hugepages。由时间问题所需要的页面,可mmap调用(见HugePages_Free的/proc/meminfo),或mmap将失败。
hugetlbfs
/sys/kernel/mm/hugepages
HugePages_Free
/proc/meminfo
这两种机制在内核树中都有自己的doc文件:hugetlbpage.txt和transhuge.txt