mmap分配的大页面比posix_memalign

时间:2019-04-26 05:36:30

标签: huge-pages

#include <stdlib.h>
#include <stdio.h>
#include <strings.h>
#include <sys/mman.h>
#include <time.h>

#define HUGEPAGE 2048*1024
void *normal_malloc(int len)
{
    void *ptr = malloc(len);
    bzero(ptr, len);
    return ptr;
}

void *trans_malloc(int len)
{
    void *ptr = NULL;
    int ret = posix_memalign(&ptr, HUGEPAGE, len);
    if(ret) perror("posix_memalign");
    ret = madvise(ptr, len, MADV_HUGEPAGE);
    bzero(ptr, len);
    return ptr;
}

void *mmap_malloc(int len)
{
    void *ptr = mmap(NULL, len, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_HUGETLB, -1,0);
    return ptr;
}

int main(int argc, char **argv)
{
    char *ptr = NULL;
    int len = HUGEPAGE*256;
    srand(time(NULL));
    switch(argc){
        case 1: ptr = normal_malloc(len);break;
        case 2: ptr = trans_malloc(len);break;
        case 3: ptr = mmap_malloc(len); break;
    }

    long j = 0;
    for(int i=0;i<len;i++){
        j += ptr[rand()%len];
    }
    return 0;
}

我使用普通的mallocposix_memalignmmap来测试性能。 我的测试结果是: malloc的花费约为29.7s,posix_memalign的花费约为23.5s,而mmapmalloc非常接近。 posix_memalignmmap都使用大页面。为什么一个有明显的改善,而另一个没有?我以错误的方式使用mmap吗? 我不为mmap做bzero,因为手册页说“其内容初始化为零”。

0 个答案:

没有答案