DPDKベースの共有ハッシュテーブル実装


DPDK自身にはrte_hash.hとrte_hash.c中.しかし、DPDKはC言語に基づいて実現されるため、C++テンプレートやクラスの強力な特性を備えていない.C言語で実装されたrte_hashでrte_hash構造体には、rte_hashは共有メモリに格納されます.ポインタが共有できないため、ユーザーは自分でハッシュ値を計算し、他のインタフェースを呼び出して要素をハッシュテーブルに挿入する必要があります.とにかくrte_hashは共有のために設計されているわけではないので、共有のニーズを満たすことはできません.
共有ハッシュテーブルを実現するために、DPDKベースの共有ハッシュテーブルをC++で実現しました.
1.任意のデータ型を収容できるテンプレート化.
2.ハッシュテーブルがいっぱいになったとき、自動的に拡張できます.
3.ロックはマルチプロセスが共有データにアクセスする安全性を保証する.ロックは最小粒度のロックを採用し、最高の効率を実現します.
4.インタフェースが簡単で使いやすい.std::hash_に類似mapのインタフェース.しかし、マルチスレッド環境では、クライアント・プログラムがハッシュ・テーブルの内容を勝手に変更しないように、いくつかの特殊な処理が行われています.
5.ソースコードはGPLオープンソースに従い、誰でも自由にコードを取得して修正することができる.
6.完全なコードを参照する必要がある場合は、メールを[email protected]
次はデモコードです.
  21 int main(int argc, char **argv) {
  22     int ret;
  23
  24     ret = rte_eal_init(argc, argv);
  25     if (ret < 0)
  26         rte_panic("Cannot init EAL
"); 27 28 char name[] = "test"; 29 shm_stl::hash_map<int, int> hs(name); 30 hs.create_or_attach(); 31 hs.insert(1, 10); 32 33 int value = 0; 34 if (hs.find(1, &value)) 35 cout << "Key : 1 --> Value : " << value << endl; 36 37 int new_value = 11; 38 Add<int> add; 39 hs.update(1, new_value, add); 40 41 if (hs.find(1, &value)) 42 cout << "Key : 1 --> Value : " << value << endl; 43 44 if (hs.erase(1, &value)) 45 cout << "Erase Key : 1 --> Value " << value << " from hash_map!" << endl; 46 else 47 cout << "Erase Key : 1 fail!" << endl; 48 49 50 if (!hs.find(1, &value)) 51 cout << "Can't find Key 1!" << endl; 52 else 53 cout << "Key : 1 --> Value : " << value << endl; 54 55 //test<int, int>(); 56 return 0; }

以下は出力結果
EAL: Ask a virtual area of 0x200000 bytes
EAL: Virtual area found at 0x7f4826200000 (size = 0x200000)
EAL: Ask a virtual area of 0x1f800000 bytes
EAL: Virtual area found at 0x7f4806800000 (size = 0x1f800000)
EAL: Ask a virtual area of 0x400000 bytes
EAL: Virtual area found at 0x7f4806200000 (size = 0x400000)
EAL: Ask a virtual area of 0x200000 bytes
EAL: Virtual area found at 0x7f4805e00000 (size = 0x200000)
EAL: Requesting 256 pages of size 2MB from socket 0
EAL: TSC frequency is ~3392462 KHz
EAL: Master core 1 is ready (tid=2787b840)
Key : 1 --> Value : 10
Key : 1 --> Value : 21
Erase Key : 1 --> Value 21 from hash_map!
Can't find Key 1!