dpdk fbarray
概述
fbarray是一个固定大小的多进程共享的内存块数组。
struct rte_fbarray {
char name[RTE_FBARRAY_NAME_LEN]; /**< name associated with an array */
unsigned int count; /**< number of entries stored */
unsigned int len; /**< current length of the array */
unsigned int elt_sz; /**< size of each element */
void *data; /**< data pointer */
rte_rwlock_t rwlock; /**< multiprocess lock */
};
fbarray中的data指针就是执行elt_sz * len大小的内存块,最后连接一块位图,用于标记哪个元素已经使用了。
每一块mmap的内存都保存到全局的链表中mem_area_tailq链表中。

如何实现多进程共享?
rte_fbarray_init
首先primary进程先计算出所需fbarray的内存块大小(对齐pagesize)mmap,此时mmap的属性是MAP_PRIVATE | MAP_ANONYMOUS,表示primary进程可见。然后在/var/run/dpdk/fbarray_%s创建对应的文件,并使用flock + LOCK_EX独占。独占成功后就转为共享flock + LOCK_SH,然后再调用ftruncate修改文件大小,并使用mmap + MAP_FIXED | MAP_SHARED转为多进程可见。
rte_fbarray_attach
这样其他进程调用mmap就可以实现共享。
多进程间使用fbarray->rwlock读写锁实现写互斥、读共享。

浙公网安备 33010602011771号