【问题标题】:What is the simplest way to allocate memory with hugepages by using C/C++ on Win/Linux? [closed]在 Win/Linux 上使用 C/C++ 为大页面分配内存的最简单方法是什么? [关闭]
【发布时间】:2015-11-29 16:48:40
【问题描述】:

在 Win/Linux 上使用 C/C++ 中的 WINAPI/POSIX 在用户空间中分配大页面(页面大小为 2 MB 或 1 GB)的内存的最简单方法是什么?

CPU:x84_64

  • WINAPI:Windows x64 7/10/Server 2012
  • POSIX:Linux x64(现代内核)

超大/大页面大小:https://en.wikipedia.org/wiki/Page_(computer_memory)#Huge_pages

【问题讨论】:

  • @David Heffernan 在 x86_64 上的页面大小可能是:4 KB、2 MB 或 1 GB。我不是关于数组大小。这是一个特殊的术语:en.wikipedia.org/wiki/Page_(computer_memory)#Huge_pages
  • 我打算给你一个 Windows 答案,但我看到你已经接受了一个 Linux 答案。无论如何,您只需要阅读文档即可。
  • 对于 Windows,记录在案:Large-Page Support。据我所知,这不是通过 POSIX 或 CRT 扩展公开的。

标签: c++ c linux winapi posix


【解决方案1】:

使用 Linux,您可以将 MAP_HUGETLB(也可能是 MAP_HUGE_2MB 等...)传递给 mmap(2)(或者可能是 mmap2(2)...)

另请参阅内核的Documentation/vm/hugetlbpage.txt

血淋淋的细节可以是特定于硬件、内核和计算机的。见/proc/meminfoproc(5)

(所以如果 mmapMAP_HUGETLB 失败,请尝试不使用它...)。

顺便说一句,您可能有一些mallocposix_memalign(3) 的实现,它们可能会在适当的时候尝试将mmapMAP_HUGETLB 结合起来。

【讨论】:

  • 谢谢!我是否需要任何特殊权限才能执行此操作?
  • 内核源代码中的 RTFM 和关联的Documentation/vm/hugetlbpage.txt; AFAIK,你需要一些特殊的配置,但我不知道细节(可能是硬件和内核特定的)
【解决方案2】:

WINAPI: VirtualAlloc.

// alocate 1 MB
void* data = VirtualAlloc( NULL, 1024 * 1024, MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE );

malloc 或 new 有什么问题?

【讨论】:

  • 谢谢。也许我们需要这个参数 MEM_LARGE_PAGES?即:void* data = VirtualAlloc( NULL, 1024 * 1024, MEM_LARGE_PAGES | MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE );msdn.microsoft.com/en-us/library/windows/desktop/…
  • @Alex 您可以使用或不使用 MEM_LARGE_PAGES。这取决于你的目的。这不是必需的。
  • 你的意思是VirtualAlloc()总是默认分配2MB页面大小的Huge/Large页面吗?你能告诉我,因为这是什么 Windows 版本?
  • @Alex 是的,VirtualAlloc 可以分配大量/大部分内存,因为引入了这个 api 功能(Windows XP 和 Windows Server 2003)。
  • @Anton Alex 专门询问了大页面。 -1。我不明白的是,为什么亚历克斯问他是否已经拥有 MSDN 文档链接,正如对此答案的第一条评论所证明的那样。
猜你喜欢
  • 2021-10-31
  • 1970-01-01
  • 2020-12-31
  • 2011-11-01
  • 1970-01-01
  • 2010-09-05
  • 1970-01-01
  • 1970-01-01
  • 2018-09-13
相关资源
最近更新 更多