vppinfra 相关结构学习
相关视频地址可以在B站上搜索的,但是ppt暂时没有找到,自己的阅读截图说明了。
vec
vec结构是最基础的类型,图片的右下角的大字比较醒目,也是初学者很容易犯的错误:
Allocation only increases,Vector origin pointer may changer,store indexes(not pointers)!
vector 原始指针可能会改变,存储索引而不是指针。这种说法成立的前提是vector操作中不调用vec_del函数,否则也不能存储索引。
通过下面vec_del1的实现就可以确认,存储索引也不是绝对安全的。
#define vec_del1(v,i) \
do { \
uword _vec_del_l = _vec_len (v) - 1; \
uword _vec_del_i = (i); \
if (_vec_del_i < _vec_del_l) \
(v)[_vec_del_i] = (v)[_vec_del_l]; \
_vec_len (v) = _vec_del_l; \
CLIB_MEM_POISON(vec_end(v), sizeof ((v)[0])); \
} while (0
bitmap
通过索引设置或获取bits位的数值。uword类型,底层是一个vec结构。
/** Allocate a bitmap with the supplied number of bits
@param [out] v - the resulting bitmap
@param n_bits - the required number of bits
*/
#define clib_bitmap_alloc(v,n_bits) \
v = vec_new (uword, ((n_bits) + BITS (uword) - 1) / BITS (uword))
pool
固定大小的内存池,基于vec和位图实现的。内存池使用的目的,下图也很明显的说明le
Sparse memory assignment ,Avoids memory fragmentation. Fast
稀疏内存分配,避免内存碎片,快速
heap
可变元素大小的内存池。 底层结构中mhash有使用heap、再就是老版本的多吓一跳场景的路由模块
Rarely used (pool are faster) 很少使用,内存池更快
still efficient 但是也很有用
to be used if you need variably sized allocations 如果需要可变大小的分配,则使用
bihash
bihash的相关介绍可以参见博客 vpp官方bihash介绍
Bihash(Bounded-index extensible hash),个人认为其特点可大致概括如下:
1、bihash支持8/16/24/40/48等类型,减少对于_mm_crc32_u32/16等的使用,提高效率的同时,避免引入GCC的bug;
2、bihash使用64bit Hash值,最多可以支持双层hash查找,第一层bucket查找,第二层page查找(后面具体分析其hash结构);
3、bucket大小和page大小均为2的指数倍,因此hash查找时,仅需要位与操作即可;
4、采用working_copy,bucket操作区变换前后添加内存屏障,实现线程安全,使得bihash的查找无锁,修改时仍可进行查找;
5、采用freelists减少heap的碎片化,同时提高分配效率;
6、采用cache_lru的方式,提高查找效率。