vppinfra--bitmap学习

2023-03-07 16:58:01 浏览数 (1)

位图就是用每一bit位来存放某种状态,适用于大规模数据,存在两种状态0和1。通常情况下用来判断某个数据存不存在的。

位图一般都使用数组来实现的,数据的每一个元素的二进制位都表示一个数据在或不在的状态。0表示数据不存在,1表示数据存在。

vppinfra--bitmap的实现接口

vppinfra 结构中bitmap 是通过索引设置或者获取bit位的数值;位宽64bits,uword类型。底层也是一个vector结构。基本数据结构如下。

  • bitmap 存储区内存申请 1、按照指定的位图数量申请bitmap内存区。
代码语言:javascript复制
/** 按照指定的位图bits数量申请bitmap内存区。
    @param [out] v - bitmap的首地址
    @param n_bits - 请求的bits数量
*/
#define clib_bitmap_alloc(v,n_bits) 
  v = vec_new (uword, ((n_bits)   BITS (uword) - 1) / BITS (uword)

2、确保bitmap内存区至少有n_bits ,不满足会动态扩充

代码语言:javascript复制
#define clib_bitmap_validate(v,n_bits) 
  clib_bitmap_vec_validate ((v), ((n_bits) - 1) / BITS (uword)
  • bitmap 设置指定bit位
代码语言:javascript复制
/* ai:bitmap的指针
 * i :需要操作d的bit位置
 * value : 设置i对应bit位位的数值,
 * return: 必须注意,当i不在ai内存范围内时,会对ai进行重新mmalloc
 * 可能存在ai执向内存区位置变更。
 */
always_inline uword *
clib_bitmap_set (uword * ai, uword i, uword value)
  • bitmap 获取指定bit位
代码语言:javascript复制
/** Gets the ith bit value from a bitmap
    @param ai - bitmap 头指针
    @param i - 要询问的bit位位置
    @returns 返回bit位的数值,存在两种情况
             1、询问的bit位位置超过ai存储区d的大小,返回0
             2、正常返回bit位的数值。
*/
always_inline uword
clib_bitmap_get (uword * ai, uword i)
  • 设置或者获取一段范围内的bitmap数值
代码语言:javascript复制
/*  n_bits 必须小于等于64。
 * i :起始bit位置
 */
always_inline uword
clib_bitmap_get_multiple (uword * bitmap, uword i, uword n_bits)
/* 必须需要注意bitmap位置的变更。
 */
always_inline uword *
clib_bitmap_set_multiple (uword * bitmap, uword i, uword value, uword n_bits)
  • 总结

本文只是简单介绍了vppinfra库中bitmap的简单的set和get使用及内存结构分布。还有很多其他的操作有需要了解的可以详细读源码。

0 人点赞