私はLinuxカーネルのハッシュテーブルの実装を理解しようとしています。私が理解できないことは、ハッシュテーブルを1つのハッシュバケットだけで初期化するコードが見つかることです。なぜコーディングがそれをしているのか分かりません。なぜLinuxカーネルで単一のハッシュバケットハッシュテーブルを使用するのですか
void __init pidhash_init(void)
{
unsigned int i, pidhash_size;
pid_hash = alloc_large_system_hash("PID", sizeof(*pid_hash), 0, 18,
HASH_EARLY | HASH_SMALL,
&pidhash_shift, NULL,
0, 4096);
pidhash_size = 1U << pidhash_shift;
for (i = 0; i < pidhash_size; i++)
INIT_HLIST_HEAD(&pid_hash[i]);
}
pid_hash
がstruct hlist_head
のリストなので、リストの各エントリは、ハッシュバケットを表します
kernel/pid.c
で:
このハッシュテーブルの使用は、私には意味があります。
しかし、この使用法は私には意味がありません:金魚ブランチのdrivers/android/binder.c
で
:
static HLIST_HEAD(binder_dead_nodes);
それは基本的に、それはハッシュテーブルである
struct hlist_head name = { .first = NULL }
に展開ただ1つのhlist_head
、すなわち1つのハッシュバケットしか持たないハッシュテーブルである。実際には二重リンクリストです。なぜ人々はこのような単一のハッシュバケットを持つハッシュテーブルを作成したいのですか?
注文が問題ではないという信号を伝えるのはなぜですか?それでも二重リンクリストを反復処理する必要があるからです。それとも、Linuxカーネルのコンベンションのようなものですか? – darklord
@darklord通常、アイテムは(挿入順で)順番に並べ替えたり、ソートしたり、気にしません。 'hlist'では、効率的に追加や索引付けを行うことができないため、順番またはソート順をすぐには許可しません。コードがスタック/ LIFOを必要とする可能性は非常に高いですが、実際には順序付けの必要なしに挿入して繰り返し処理するだけのものが一般的です。 –