VPP mheap pool原理简单分析

vpp中hash/bihash管理的控制面或数据面表项一般伴随VPP进程的始终,由于程序长时间运行,如果使用malloc动态申请这段内存会造成堆内存碎片,会导致堆内存无限增大,造成类似于内存泄漏的问题。

1. malloc和mmap内存申请区别

malloc使用brk分配的内存,需要等到高地址内存释放以后才能释放,申请大内存(大于128k)时候使用的是mmap系统调用;
mmap系统调用是在堆和栈之间分配一块内存,这块内存可以单独释放,不会造成内存“空洞”,也不会影响到堆顶内存的缩减释放。
mmap的缺点是按需调页:一页大小4k bytes,如果需要的内存很小,会造成内存浪费;频繁的mmap、munmap会造成大量的缺页中断,给CPU带来额外的负担。
所以小内存或频繁的申请释放用malloc;一次申请终身使用的内存用mmap。

2.VPP的mheap内存池

VPP中充分考虑这种情况,使用mmap匿名映射申请内存池:

/* Allocate virtual address space. */
always_inline void *
clib_mem_vm_alloc (uword size)
{
  void *mmap_addr;
  uword flags = MAP_PRIVATE;

#ifdef MAP_ANONYMOUS
  flags |= MAP_ANONYMOUS;
#endif

  mmap_addr = mmap (0, size, PROT_READ | PROT_WRITE, flags, -1, 0);
  if (mmap_addr == (void *) -1)
    mmap_addr = 0;

  return mmap_addr;
}

在 C 语言的动态申请内存技术中,相比起 alloc/free 系统调用,内存池(memory pool)是预先在系统中请求一大片连续的内存空间,然后在运行时根据实际需要分配出去的技术。使用内存池的优点有:
(1)速度远比 malloc/free 快,因为减少了系统调用的次数,特别是频繁申请/释放内存块的情况
(2)避免了频繁申请/释放内存之后,造成系统的大量内存碎片

你可能感兴趣的:(VPP)