Ale*_*kov 5 c memory macos memory-management huge-pages
Mac OS X mmap手册页说可以分配超级页面,我收集它与Linux大页面相同.
https://developer.apple.com/library/mac/documentation/Darwin/Reference/ManPages/man2/mmap.2.html
但是,在Mac OS X(Yosemite 10.10.5)上,以下简单测试失败:
#include <stdio.h>
#include <sys/mman.h>
#include <mach/vm_statistics.h>
int
main()
{
void *p = mmap((void *) 0x000200000000, 8 * 1024 * 1024,
PROT_READ | PROT_WRITE,
MAP_ANON | MAP_FIXED | MAP_PRIVATE,
VM_FLAGS_SUPERPAGE_SIZE_2MB, 0);
printf("%p\n", p);
if (p == MAP_FAILED)
perror(NULL);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输出是:
0xffffffffffffffff
Cannot allocate memory
Run Code Online (Sandbox Code Playgroud)
结果与MAP_FIXED从标志中删除并NULL作为地址参数提供的结果相同.VM_FLAGS_SUPERPAGE_SIZE_2MB用-1预期结果替换结果,即没有错误发生,但显然分配的内存空间使用常规的4k页面.
以这种方式分配超级页面可能会出现什么问题?
mpp*_*ppf -1
对发布的示例进行的这个小修改适用于 Mac OS 10.10.5:
#include <stdio.h>
#include <sys/mman.h>
#include <mach/vm_statistics.h>
int
main()
{
void *p = mmap(NULL,
8*1024*1024,
PROT_READ | PROT_WRITE,
MAP_ANON | MAP_PRIVATE,
VM_FLAGS_SUPERPAGE_SIZE_2MB, // mach flags in fd argument
0);
printf("%p\n", p);
if (p == MAP_FAILED)
perror(NULL);
return 0;
}
Run Code Online (Sandbox Code Playgroud)