在 Win/Linux 上使用 C/C++ 为大页面分配内存的最简单方法是啥? [关闭]
Posted
技术标签:
【中文标题】在 Win/Linux 上使用 C/C++ 为大页面分配内存的最简单方法是啥? [关闭]【英文标题】: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 扩展公开的。 【参考方案1】:使用 Linux,您可以将 MAP_HUGETLB
(也可能是 MAP_HUGE_2MB
等...)传递给 mmap(2)(或者可能是 mmap2(2)...)
另请参阅内核的Documentation/vm/hugetlbpage.txt
血淋淋的细节可以是特定于硬件、内核和计算机的。见/proc/meminfo
和proc(5)
(所以如果 mmap
和 MAP_HUGETLB
失败,请尝试不使用它...)。
顺便说一句,您可能有一些malloc
或posix_memalign(3) 的实现,它们可能会在适当的时候尝试将mmap
与MAP_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 文档链接,正如对此答案的第一条评论所证明的那样。以上是关于在 Win/Linux 上使用 C/C++ 为大页面分配内存的最简单方法是啥? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章
Linux学习 : 裸板调试 之 配置使用NAND FLASH
Linux下大页HugePages与透明大页Transparent HugePages
Linux下大页HugePages与透明大页Transparent HugePages