使用mmap和madvise用于大页面

ssb*_*ssb 14 c linux memory-management mmap huge-pages

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

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

base_ptr_ = mmap(NULL, memory_size_, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS | MAP_HUGETLB, -1, 0);
Run Code Online (Sandbox Code Playgroud)

和呼号的MADV_HUGEPAGE旗帜madvise-

madvise(base_ptr_, memory_size_, MADV_HUGEPAGE);
Run Code Online (Sandbox Code Playgroud)

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

Fre*_*rdt 17

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

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

  • mmap实际上将继续从内核的内部hugetlbfs挂载中保留页面,其状态可以在下面看到/sys/kernel/mm/hugepages.有问题的页面都需要通过时间可mmap被调用(见HugePages_Free/proc/meminfo),或mmap将失败.

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

  • 这取决于,如果您控制机器上的所有内容,并确切知道程序的行为方式,那么`mmap`将允许您准确指定行为方式.如果您不确定如何使用内存(它会碎片吗?系统中是否还有其他大型页面用户),那么透明的hugepage最终会为您提供最佳结果. (6认同)
  • 此外,“madvise”仅适用于私有匿名映射。 (3认同)