Linux论坛's Archiver

《开源》旗舰电子杂志2009年第1期火热下载!

rose 发表于 2007-12-29 11:10

cell中hugepage的使用

当你需要分配一块10k的内存的时候,直接调用malloc可能会失败,那么就可以采用cell中的hugepage。
下面的指令可以为你预留一段320M(1个hugepage是16M)的连续内存供使用:
mkdir -p /huge
echo 20 > /proc/sys/vm/nr_hugepages
mount -t hugetlbfs nodev /huge
如果你希望希望下次重启的时候就已经配置hugepage了,那么可以将上面的指令加到文件/etc/rc.d/rc.sysinit中
下面的指令可以查看hugepage是否生效:
grep Huge /proc/meminfo
显示:
HugePages_Total:    20
HugePages_Free:     20
HugePages_Rsvd:      0
Hugepagesize:    16384 kB
表明生效了,当前剩余20个没有使用


具体在代码中这样使用:
#define MFILE "/huge/myprogram.bin"
#define NEED_SIZE 20*1024*1024
#define HUGE_PAGE_SIZE 16*1024*1024
    int mfile = 0;   
    void *maddr = NULL;
    int huge_size = 0;

    mfile = open(MFILE, O_CREAT | O_RDWR, 0755);
    if( mfile == -1 )
    {
        printf("Can't open %s\n",MFILE);
        return -1;
    }
    huge_size = (NEED_SIZE + HUGE_PAGE_SIZE-1) & ~(HUGE_PAGE_SIZE-1);
    remove(MFILE);
    maddr = mmap (0, huge_size, PROT_READ | PROT_WRITE, MAP_SHARED, mfile, 0);
    if( maddr == MAP_FAILED )
    {
        printf("Unable to map file %s, huge_size=%d\n",MFILE,huge_size);
        close(mfile);        
        remove(MFILE);
        return -1;
    }

生成的这个maddr就可以使用了,结束的时候需要如下代码释放资源:
munmap( maddr, huge_size ) ;
close(mfile);        

注意:如果你需要的大小不是HUGE_HUGE_SIZE(16M)的整数倍,需要先计算为16M的整数倍,不然会map失败

页: [1]

Powered by Discuz! Archiver 7.0.0  © 2001-2009 Comsenz Inc.