2. VPP源码分析(内存管理之抽象数据结构)

1.2. 抽象数据结构

1.2.1. vector

7
CLIB vectors are ubiquitous dynamically resized arrays with by user defined "headers".
Many CLIB data structures (e.g. hash, heap, pool) are vectors with various different headers.

The memory layout looks like this:

                  user header (aligned to uword boundary)
                  vector length: number of elements
 user's pointer-> vector element #0
                  vector element #1
                  ...

vector结构经常和user定义的header结合
8

Many macros have _a variants supporting alignment of vector data and _h variants supporting non zero length vector headers.
The _ha variants support both
9
10

1.2.2. bitmap

Set and get bits with indexes.Lots of them. Implemented as a uword vector.
typedef uword clib_bitmap_t;
12

uword *bitmap = 0;
clib_bitmap_alloc(bitmap, 100);     //Allocate bitmap for 100 bits
clib_bitmap_validate(bitmap, 200); //Make room for 201 bits
clib_bitmap_set(bitmap, 33, 1);
clib_bitmap_get(bitmap, 33);

uword a = clib_bitmap_get_multiple(bitmap, 3, 10); //Get bits from 3 to 12 included
uword clib_bitmap_first_set(uword *ai);
uword clib_bitmap_first_clear(uword *ai);
uword clib_bitmap_next_set(uword *ai, uword i);
uword clib_bitmap_next_clear(uword *ai, uword i);
uword clib_bitmap_count_set_bits(uword *ai);

1.2.3. pool

Fixed sized element allocator. Based on a vec and a bitmap.
12

  • free_bitmap:Bitmap of indices of free objects.
  • free_indices:Vector of free indices. One element for each set bit in bitmap.

The following fields are set for fixed-size, preallocated pools

  • max_elts:Maximum size of the pool, in elements
  • mmap_base, mmap_size:mmap segment info: base + length
    13
T *pool = 0;
T *e;
pool_get(pool, e);
//pool_get_aligned(pool, e, 4);

//Query if element is free
pool_is_free(pool,e);
pool_is_free_index(pool, e – pool);

//Unalloc element
pool_put(pool,e);

//Free the whole pool
pool_free(pool);

// Allocated element count
pool_elts(pool);

1.2.4. heap

Variable element size allocator. 和pool类似只不过pool中的每个元素是定长的而heap中的元素是变长的。
pool和heap是建立在vec和bitmap上的两种高级数据结构,而mheap是实现这些数据结构的最基础的内存管理单元,这里不要混淆了。

  • elts:Vector of used and free elements.
  • small_free_elt_free_index:For elt_bytes < sizeof (u32) we need some extra space per elt to store free list index.
  • free_elts:Vector of free indices of elts array.
  • free_lists:Indices of free elts indexed by size bin.
  • used_elt_bitmap:Used for validattion/debugging.
  • head, tail:First and last element of doubly linked chain of elements.
  • elt_bytes:Number of bytes in a help element.
T *heap = 0;
T *e;

//Allocate 4xT.
U32 handle;
u32 offset = heap_alloc(heap, 4, handle);

//Allocated heap[offset] – heap[offset + 4]
//Object size
heap_size(heap, handle);

//Deallocate
heap_dealloc(heap, handle);

Rarely used (pools are faster). Still efficient.
To be used if you need variably sized allocations.
e.g. classifier

1.3. 内存管理的目的

提高cache命中率!!!
14

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值