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]