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链表中。
fbarray的data

如何实现多进程共享?

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读写锁实现写互斥、读共享。

posted @ 2024-12-08 17:15  yghr  阅读(63)  评论(0)    收藏  举报