dpdk無鎖環形佇列的使用

2021-09-17 04:04:25 字數 1018 閱讀 4336

入口使用dpdk,資料報解包分析後續處理執行緒效能太低,cpu很大一部分浪費在多執行緒鎖開銷上,於是想用dpdk無鎖佇列,看是否有改善。

使用前不知道dpdk的ring是否能在收發包之外使用,也沒找到實際使用跟收發包無關的例子

也不需要使用mbuf,需要儲存乙個指標的佇列,直接拿過來用看看可不可以。

前面dpdk初始化完畢,後面跟dpdk無關的地方,直接包含標頭檔案使用,根據例子建立環形佇列(個數為2的指數),enqueue,dequeue,使用ok,效能有所提公升

//建立

//單生產單消費,根據自己需要設定

#define ring_size 131072

rte_list = rte_ring_create("circlering_1", ring_size, socket_id_any, ring_f_sc_deq | ring_f_sp_enq);

if (cirlist == null)

printf("write to file rte ring create error!\n");

else

printf("write to file rte ring create success:%d!\n",m_max_cache_size);

static int count = 1;

if (!su || !cirlist)

return;

//使用,也可以一次入多個,一次取多個

int enqueuelist(strparams* pbuf)

delete pbuf;

pbuf = null;

return ret;

}return ret;

}//出隊,取資料

#define dequeue_count 64

void dequeuering(int count)

if (unlikely(count== 0))

for(int i = 0; i < count; i++)

}

無鎖環形佇列

環形一讀一寫佇列中,不需要擔心unsigned long溢位問題,因為溢位後自動回歸,相減值還會保留。示例一 注 max count 必須為 2 的指數,即 2,4,8,16.佇列尺寸 define max count 4096 define max mask 4095 max count 1 變數...

環形無鎖佇列

1 元素是先進先出的 由佇列的性質保證的,在環形佇列中通過對佇列的順序訪問保證 2 空間可以重複利用 因為一般的環形佇列都是乙個元素數固定的乙個閉環,可以在環形佇列初始化的時候分配好確定的記憶體空間,當進隊或出隊時只需要返回指定元素記憶體空間的位址即可,這些記憶體空間可以重複利用,避免頻繁記憶體分配...

使用無鎖佇列(環形緩衝區)注意事項

環形緩衝區是生產者和消費者模型中常用的資料結構。生產者將資料放入陣列的尾端,而消費者從陣列的另一端移走資料,當達到陣列的尾部時,生產者繞回到陣列的頭部。如果只有乙個生產者和乙個消費者,那麼就可以做到免鎖訪問環形緩衝區 ring buffer 寫入索引只允許生產者訪問並修改,只要寫入者在更新索引之前將...