概述
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
讀寫鎖實現寫互斥、讀共享。