c - 对大页面使用 mmap 和 madvise

标签 c linux memory-management mmap 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);

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.txttranshuge.txt

关于c - 对大页面使用 mmap 和 madvise,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30470972/

相关文章:

linux - dd命令调整文件系统

c++ - 链表的链表的析构函数

perl - 我如何清理我的守护进程?

ios - 保留循环与父子构造

c - 如何获得最快的数据处理方式: fork or/and multithreading

c - #define SQR(x) (x*x) 的错误答案

linux - 为什么我的 awk 命令多打印一行?

java - 为什么java的RandomAccessFile在linux上不返回?

c - connect() C 函数无法连接我的路由器,但我可以使用 javascript ajax 调用连接它

c - 将十进制定点/浮点格式打印为十六进制