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