【问题标题】:Using mmap and madvise for huge pages使用 mmap 和 madvise 处理大页面
【发布时间】:2015-08-08 20:39:25
【问题描述】:

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

也就是说,使用 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);

谁能解释一下两者的区别?

【问题讨论】:

    标签: c linux memory-management mmap huge-pages


    【解决方案1】:

    这两个函数执行不同的操作,这在您的上下文中可能很重要,也可能无关紧要:

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

    • mmap 实际上会从内核内部的hugetlbfs 挂载中保留页面,其状态可以在/sys/kernel/mm/hugepages 下看到。在调用mmap 时,相关页面需要可用(请参阅/proc/meminfo 中的HugePages_Free),否则mmap 将失败。

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

    【讨论】:

    • 鉴于有足够多的可用页面...mmap 是更可靠的选择吗?对吗?
    • 这取决于,如果您控制机器上的所有东西,并且确切地知道您的程序将如何运行,那么mmap 将允许您准确指定如何运行。如果您不确定内存将如何使用(它会碎片化吗?系统中是否还有其他大页面用户),那么透明大页面最终将为您提供最佳结果。
    • 另外,madvise 仅适用于私有匿名映射。
    猜你喜欢
    • 2023-03-21
    • 2021-09-02
    • 1970-01-01
    • 1970-01-01
    • 2013-02-03
    • 2015-06-01
    • 1970-01-01
    • 2021-12-20
    • 1970-01-01
    相关资源
    最近更新 更多