vpp vector指北

vpp vector指北

版权声明:本文为CSDN博主「成王君」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_45429253/article/details/97020110

vectors 的本质

外在表现

很简单,实际上就是一个动态的可变大小数组。这个数组:

  • 每个元素的大小可以变化,数组大小可以变化。从而使得其可以作为任何数据结构的存储结构,事实上,VPP就是这样做的,所有数据结构的存储结构就是vectors。
  • 用户自定义头结构,表示vectors表示的存储结构对应的全部或部分逻辑结构的信息。
  • 利用头部位图表示数组某个元素是否已经被使用
  • 用户可以用C数组的访问方式访问vectors,效率极高
  • 提供了一系列对vectors的操作宏,函数。
  • 对vector中的数据结构,经过指针变换后,仍然保持原数据结构的访问方式。

为什么定义vectors结构

这实际上是网络操作系统多年实践中得来的经验。作为转发协议栈:

  1. 需要极致高效,
  2. 从1, 各模块需要共享数据结构
  3. 新的特性,协议及相关的安全需求不断出现导致其更新永不停,
  4. 可移植,可维护,可扩展,可测试,可调试
  5. 热插拔,主备冗余转发表数据同步及恢复

这些需求直接导致的就是转发协议栈程序极易出现bug,尤其是内存相关的bug。因此,普遍的,网络操作系统通常自己实现一个内部的内存管理系统,期待更细致的跟踪每个模块甚至每个数据结构的内存使用,但这种系统往往仍然是一个大一统方案,仅仅增加了一些公用的使用统计信息,对每个数据结构的分析仍然要依靠各模块做额外的开发工作。
vectors则是从基础的存储结构的角度出发,统一了所有数据结构的存储结构,从而强行使得每个数据结构规范自己的内存管理。同时又尽量的贴近C语言内存使用习惯,编码和运行都能高效化。
使用vectors后,可以仅在vectors层面即可生成程序运行时数据快照(很遗憾,这部分VPP没有实现,个人认为cisco开源时故意拿去了这一部分)。可以利用外部程序对数据快照进行自动化分析。使得问题分析和运行时解耦,减轻在各程序模块针对快照数据分析的开发及其带来的一系列麻烦。同时可以使用更合适的工具进行分析,提高运行时及分析效率。
同时,vectors这种数组设计,使得数据同步及恢复可以批量copy,不但高效而且可以简化和更好的模块化相关程序(VPP中没有实现)。

vector的使用

作为常规的内存操作来使用

vec_resize,vec_alloc,vec_new,vec_add,vec_add1,vec_add2等都可用于常规的内存申请(类似malloc),统一用vec_free做内存释放(类似free)。
vec_dup,vec_copy,vec_clone完成内存复制(类似memcpy)
vec_cmp完成内存比较(类似memcmp)
vec_zero完成内存清零(类似memset)
vec_set完成内存设置为某个值(memset)

作为常用数据结构使用

  • 数组

    vectors本身就是一个极佳的动态数组实现。
    vec_insert ,vec_insert_elts数组内插入元素;
    vec_del,vec_delete数组内删除元素;
    vec_append,vec_prepend连接两个数组;

  • 其他数据结构

    对于其他结构,必须熟悉利用数组作为存储结构的实现方式,而且,通常会附加很多算法技巧。

总结

vectors本质上提供了一种针对每一种数据结构的高效的内存管理机制。利用vectors作为基础存储结构,可以有效降低程序中内存问题bug。并为对程序运行时数据分析,数据同步,恢复等奠定了良好的基础。

reference

  1. https://blog.csdn.net/weixin_45429253/article/details/97020110
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

growdu_real

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值