【问题标题】:Understanding the PID hash table in the linux kernel了解linux内核中的PID哈希表
【发布时间】:2016-12-26 19:30:15
【问题描述】:

“理解 Linux Kernel 第 3 版”一书的这一部分解释说,内核引入了 4 个哈希表,而不是搜索进程列表来查找 PID,每个哈希表对应一种 PID。

据我了解,表的每个元素都是 PID 的哈希值。但这如何使搜索变得容易?例如,给定一个 PID,是否存在 4 个哈希表,因为在该 PID 类型的哈希中搜索而不是在所有 PID 的 lit 中搜索更快?另外,为什么散列有帮助?搜索哈希不是比搜索简单数字更难吗?

那么,这 4 个表之一中的条目到底是什么?它们是进程描述符吗?我把它们理解为它。并且在每个进程描述符中,都有一个结构链接到其他处于相同状态的相似进程,例如,处于同一组和相同状态的进程。

是这个吗?

【问题讨论】:

  • 散列比顺序搜索更快,因为它具有恒定时间(或接近恒定时间)查找而不是线性时间。
  • @e0k 怎么样?在表中搜索哈希与在表中搜索数字不一样吗?
  • 那是一本经典的书,但请记住它的年代久远(内核 v2.6)。
  • @e0k 是的,但我找不到有关最新内核的任何信息。你知道一个吗?

标签: c linux hash linux-kernel


【解决方案1】:

内核将所有进程存储在任务列表中。任务列表是一个循环双向链表。这意味着列表中的每个元素都有指向下一个元素和前一个元素的指针。第一项链接到最后一项,反之亦然。它在概念上可以被认为是一个圆圈。

在每个任务中都有一个进程描述符,其中包含您感兴趣的 PID 信息。他们的意思是,通常,要找到您要杀死的进程,您必须遍历任务列表,查看每个任务的每个进程描述符的 PID 字段,直到找到您要查找的那个。您不能通过 PID 直接引用它们,因为您不知道它在内存中的位置。这就是链接的用途。这样任务列表就不需要占用连续的内存空间了。只需通过重新链接即可实现插入和删除。每个进程都知道 IT 在内存中的位置。它可以使用它在内存中的位置来跟踪链接,直到找到它正在寻找的进程。

这称为线性时间搜索。最坏的情况是,给定 N 个元素,您需要进行 N 次操作才能找到结果。在描述效率时,您总是假设平均最坏情况。如果您有大量数据,线性时间在搜索时效率非常低。

他们说的是有 4 个表,您可以在其中通过哈希函数放置您的 PID(取决于您的预期目标),检查结果所在位置的表,并确切知道任务列表中的任务。那是一个操作。减轻冲突是散列函数的工作。但是平均最坏情况,这称为恒定时间。更快。

没有搜索一个简单的数字这样的事情。您正在遍历位于不同内存位置的数据结构。如果你有一个 C 数组,它们会预先分配在堆栈中的连续内存空间中。因此,在这种情况下,您的数组索引号将指向您立即需要的内存块。但这里不是这样。这些数据结构既不是静态的也不是预先分配的。所以你需要一些方法来从内存地址跳转到内存地址。这就是这些数据结构所要解决的问题。

我希望这能解决问题。

来源: https://en.wikipedia.org/wiki/Hash_table http://www.makelinux.net/books/lkd2/app01lev1sec1

【讨论】:

    猜你喜欢
    • 2015-03-07
    • 1970-01-01
    • 2011-06-07
    • 1970-01-01
    • 2020-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-11
    相关资源
    最近更新 更多