我想在 Linux 机器使用的大页面上分配内存。我看到有两种方法可以做到这一点,使用 mmap
和 madvise
。
也就是说,在 mmap
调用中使用 MAP_HUGETLB
标志 -
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
被调用时可用(参见/proc/meminfo
中的HugePages_Free
),或者mmap
会失败。
这两种机制在内核树中有自己的文档文件:hugetlbpage.txt和 transhuge.txt
关于c - 对大页面使用 mmap 和 madvise,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30470972/