Cisco VPP中vectors解析
vectors 的本质
外在表现
很简单,实际上就是一个动态的可变大小数组。这个数组:
- 每个元素的大小可以变化,数组大小可以变化。从而使得其可以作为任何数据结构的存储结构,事实上,VPP就是这样做的,所有数据结构的存储结构就是vectors。
- 用户自定义头结构,表示vectors表示的存储结构对应的全部或部分逻辑结构的信息。
- 利用头部位图表示数组某个元素是否已经被使用
- 用户可以用C数组的访问方式访问vectors,效率极高
- 提供了一系列对vectors的操作宏,函数。
- 对vector中的数据结构,经过指针变换后,仍然保持原数据结构的访问方式。
为什么定义vectors结构
这实际上是网络操作系统多年实践中得来的经验。作为转发协议栈:
- 需要极致高效,
- 从1, 各模块需要共享数据结构
- 新的特性,协议及相关的安全需求不断出现导致其更新永不停,
- 可移植,可维护,可扩展,可测试,可调试
- 热插拔,主备冗余转发表数据同步及恢复
这些需求直接导致的就是转发协议栈程序极易出现bug,尤其是内存相关的bug。因此,普遍的,网络操作系统通常自己实现一个内部的内存管理系统,期待更细致的跟踪每个模块甚至每个数据结构的内存使用,但这种系统往往仍然是一个大一统方案,仅仅增加了一些公用的使用统计信息,对每个数据结构的分析仍然要依靠各模块做额外