2016-12-23 3 views
2

私は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_hashstruct 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つのハッシュバケットしか持たないハッシュテーブルである。実際には二重リンクリストです。なぜ人々はこのような単一のハッシュバケットを持つハッシュテーブルを作成したいのですか?

答えて

3

hlistは単なる通常のダブルリンクリストです。

listhlistの違いは、空リストの50%のメモリ削減のためにリストの末尾にO(1)アクセスすることです。これは、多くの空のリストを持ち、逆順または後ろからリストにアクセスする必要がないハッシュテーブルに最適です。

ただし、通常のリンクリストにも適しています。

hlistを使用すると、listに数バイトの保存が行われ、不明な数のアイテムを収集するために使用されることがわかります。

+0

注文が問題ではないという信号を伝えるのはなぜですか?それでも二重リンクリストを反復処理する必要があるからです。それとも、Linuxカーネルのコンベンションのようなものですか? – darklord

+0

@darklord通常、アイテムは(挿入順で)順番に並べ替えたり、ソートしたり、気にしません。 'hlist'では、効率的に追加や索引付けを行うことができないため、順番またはソート順をすぐには許可しません。コードがスタック/ LIFOを必要とする可能性は非常に高いですが、実際には順序付けの必要なしに挿入して繰り返し処理するだけのものが一般的です。 –

関連する問題