前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >vppinfra--memory pool

vppinfra--memory pool

作者头像
dpdk-vpp源码解读
发布2023-01-04 12:36:36
3410
发布2023-01-04 12:36:36
举报
文章被收录于专栏:DPDK VPP源码分析DPDK VPP源码分析

内存池简介

内存池(memory pool)是在当前系统中请求一大片连续的内存空间,然后在运行时根据实际需要分配出去的技术。使用内存池的优点如下: 1、速度远比 malloc/free 快,因为减少了系统调用的次数,特别是频繁申请/释放内存块的情况。 2、避免了频繁申请/释放内存之后,系统的大量内存碎片。 3、节省空间

内存池分类

根据分配内存池的大小,内存池可以分为两类: 1、固定大小内存池,对应vpp的pool内存池。 2、可变长内存池, 对应vpp的heap内存池。

Pool 基本结构及内存分布介绍

代码语言:javascript
复制
 固定大小的内存池,基于vector和位图实现的。下面pool header结构如下:
代码语言:javascript
复制
typedef struct
{
  /** 内存池中内存块使用状态的bitmap,未使用free状态置位1,已使用置位0*/
  uword *free_bitmap;
  /**vector结构,保存已经释放数据块索引 */
  u32 *free_indices;
  /* 以下字段是为固定大小的预分配池设置的 */
  /** 当前内存池最多支持元素个数 */
  u32 max_elts;
  /** 内存池首地址 */
  u8 *mmap_base;
  u64 mmap_size;/*当前内存池占用内存的总大小*/
} pool_header_t;

vpp pool 分为两种: 一种是内存池的元素个数是无限制的,支持动态扩展。内存地址是在全局mheap上申请的。优点:按需分配,节省内存。

注意:从pool内存池中get操作可能会存在内存不足的情况,会从mheap堆上重新申请一块大内存,旧的内存将被释放;这样P指向的地址就发生的变更,需要重新进行赋值。一般在初始化时申请足够的内存池大小。

一种是内存池的元素个数是受限的,不支持动态扩展。内存地址是通过mmap直接映射的系统内存。缺点:不支持动态扩展,超过内存池最大元素大小时报错;内存池利用率低时,浪费内存。

代码语言:javascript
复制
/** initialize a fixed-size, preallocated pool */
#define pool_init_fixed(pool,max_elts)                  \
{                                                       \
  _pool_init_fixed((void **)&(pool),sizeof(pool[0]),max_elts);  \
}

内存池相关操作函数

下面函数是获取pool空闲内存单元的数量,但是vec_capacity计算的剩余字节数目,这个函数是存在问题的(vpp项目未发现有调用的地方)。如果想使用需要修改一下。

代码语言:javascript
复制
/** Queries whether pool has at least N_FREE free elements. */
always_inline uword
pool_free_elts (void *v)
{
  pool_header_t *p = pool_header (v);
  uword n_free = 0;

  if (v)
    {
      /*计算pool池剩余数量*/
      n_free += vec_len (p->free_indices);
      /* Space left at end of vector? 计算剩余字节大小*/
      n_free += vec_capacity (v, sizeof (p[0])) - vec_len (v);
    }
  return n_free;
}

pool相关操作函数如下:

总结:

本文简单介绍vpp基础库中pool内存池基本内存分布及操作函数。pool结构是经常使用的,是通过连续数组方式实现的,也是比较高效的原因。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2021-10-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 DPDK VPP源码分析 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 内存池简介
  • 内存池分类
  • Pool 基本结构及内存分布介绍
  • 内存池相关操作函数
  • 总结:
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档