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

vppinfra----fifo

作者头像
dpdk-vpp源码解读
发布2023-03-07 17:01:21
1.2K0
发布2023-03-07 17:01:21
举报
文章被收录于专栏:DPDK VPP源码分析DPDK VPP源码分析

FIFO(first in first out)先进先出的存储结构。和ring队列结构一样,区别是fifo支持动态扩展存储区大小。也是支持任意数据类型。处理逻辑和ring队列差不多。

相关代码在src/vppinfra/fifo.【ch】文件,代码总共也不到500H。

  • fifo header结构
代码语言:javascript
复制
typedef struct
{
  /* First index of valid data in fifo. */
  u32 head_index;
  /* One beyond last index in fifo. */
  u32 tail_index;
} clib_fifo_header_t;

head_index : fifo中有效数据的第一个索引

tail_index: fifo中尾部元素索引,表示下一个可加数据的索引。这个不要理解错了。我们可以通过函数获取fifo有效元素个数可以确认。

代码语言:javascript
复制
always_inline uword
clib_fifo_elts (void *v)
{
  word l, r;
  clib_fifo_header_t *f = clib_fifo_header (v);

  if (!v)
    return 0;

  l = _clib_fifo_len (v);
  r = (word) f->tail_index - (word) f->head_index;
  r = r < 0 ? r + l : r;
  ASSERT (r >= 0 && r <= l);
  return r;
}
  • file 内存分布 简单画出fifo内存分布,当然tail_index 也可以比head_index小。
  • file相关处理函数 函数实现相对都不太难,但是有些函数使用需要注意一下。比如 clib_fifo_advance_tail(f,n_elts),elts 可以是正数也可以是负数。如果是负数的时候,相当于覆盖已有数据。但是需要主要不能超过现有fifo的已有数据的大小。否则会报错。
  • 使用实例 1、声明结构体T,并定义f指针
代码语言:javascript
复制
typedef struct { int a, b; } T;
T * f = 0;

2、filo中添加元素,有三种方式

#1 给定元素X,添加到fifo中

代码语言:javascript
复制
T x;
x.a = 10; x.b = 20;
fifo_add1 (f, x);

#2 批量添加元素。

代码语言:javascript
复制
T buf[10];
initialize buf[0] .. buf[9];
fifo_add (f, buf, 10);

#3 添加1个元素,返回对应的指针,并对元素赋值。

代码语言:javascript
复制
 T * x;
       fifo_add2 (f, x);
       x->a = 10;
       x->b = 20;

3、 从fifo中删除元素

代码语言:javascript
复制
T x;
fifo_sub1 (f, x);

4、释放

代码语言:javascript
复制
 fifo_free (f) 
  • 总结: 本文只是简单介绍的fifo的结构使用。目前在vpp代码中在tcp协议栈处理中有使用。fifo只适合小规格数据的存储,主要是因为在动态扩充的时候,是申请新的fifo内存,旧的fifo数据copy到新的fifo中,释放旧的fifo。
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-09-26,如有侵权请联系 cloudcommunity@tencent.com 删除

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

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
对象存储
对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档