繁体   English   中英

使用mmap和madvise用于大页面

[英]Using mmap and madvise for huge pages

我想在Linux机器使用的大页面上分配内存。 我看到有两种方法可以做到这一点,使用mmapmadvise

也就是说,使用带有mmap调用的MAP_HUGETLB标志 -

base_ptr_ = mmap(NULL, memory_size_, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS | MAP_HUGETLB, -1, 0);

带有madvise呼叫的MADV_HUGEPAGE标志 -

madvise(base_ptr_, memory_size_, MADV_HUGEPAGE);

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

这两个函数执行不同的操作,这些操作在您的上下文中可能或可能不重要

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

  • mmap实际上将继续从内核的内部hugetlbfs mount保留页面,其状态可以在/sys/kernel/mm/hugepages 有问题的页面需要在调用mmap可用(请参阅/proc/meminfo HugePages_Free ),否则mmap将失败。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM