为什么在linux内核中使用单个哈希桶哈希表

时间:2016-12-23 18:50:48

标签: linux linux-kernel

我试图了解linux内核的哈希表的实现。我不明白的是,我发现代码初始化只有一个哈希桶的哈希表。我不知道为什么编码会这样做。

这个哈希表用法对我有意义:

kernel/pid.c

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的列表,因此列表中的每个条目都代表一个哈希桶。

然而,这种用法对我没有意义:

drivers/android/binder.c金鱼分支中:

static HLIST_HEAD(binder_dead_nodes);

它扩展到

struct hlist_head name = {  .first = NULL }

基本上它是一个只有一个hlist_head的哈希表,即只有一个哈希桶的哈希表。所以它实际上是一个双链表。为什么人们想用这样的哈希桶创建一个哈希表呢?​​

1 个答案:

答案 0 :(得分:3)

hlist只是一个常规的双重链表。

listhlist之间的区别仅在于hlist交易O(1)访问列表尾部,以便为空列表减少50%的内存。这对于哈希表来说是完美的,哈希表有很多空列表,从不需要反向或从后面访问列表。

但是,它对于常规链接列表也很有用。

通过使用hlist,他们在list上保存了几个字节,并向我们发出了一个强烈的信号,表明该列表用于收集未知数量的项目,其顺序并不重要