“了解Linux内核第3版”一书的这一部分解释了,为了找到PID,内核不是搜索进程列表,而是引入4个哈希表,每种类型的PID一个。
据我所知,表的每个元素都是PID的哈希值。但这又如何使搜索变得容易?例如,给定一个PID,是否存在4个哈希表,因为只搜索该PID类型的哈希值而不是在所有PID点亮时搜索更快?另外,为什么散列有帮助?是不是在搜索哈希比搜索简单数字更困难?
那么,在这4个表中的一个表中究竟是什么条目?它们是过程描述符吗?我理解他们就是这样。并且在每个进程描述符中,有一个结构链接到处于相同状态的其他类似进程,即,例如,处于同一组和相同状态的进程。
这是吗?答案 0 :(得分:2)
内核将所有进程存储在任务列表中。任务列表是循环双向链表。这意味着列表中的每个元素都有指向下一个元素和前一个元素的指针。第一项链接到最后一项,反之亦然。它可以在概念上被认为是一个圆圈。
在每个任务中都有一个进程描述符,它包含你感兴趣的PID信息。他们所说的是,通常,为了找到你想要杀死的进程,你必须遍历任务列表,查看每个任务的每个进程描述符的PID字段,直到找到您要查找的那个。您不能通过PID直接引用它们,因为您不知道它在内存中的位置。这就是链接的用途。这样任务列表就不需要占用连续的内存空间。只需重新链接即可实现插入和删除。每个进程都知道IT在内存中的位置。并且它可以使用它在内存中的位置来跟踪链接,直到它找到它正在寻找的过程。
这称为线性时间搜索。最糟糕的情况是,给定N个元素,您需要N次操作才能找到结果。在描述效率时,你总是假设平均最坏的情况。在搜索是否有大量数据时,线性时间效率非常低。
他们所说的是有4个表,您可以通过哈希函数放置PID(取决于您的预期目标),检查结果位置的表格,并确切知道该结果的内存地址任务列表中的任务。这是一个操作。这是哈希函数减轻冲突的工作。但平均最坏的情况,即所谓的恒定时间。快得多。
没有搜索简单数字的事情。您正在遍历位于不同内存位置的数据结构。如果您有一个C数组,那么这些数组是在连续内存空间的堆栈中预先分配的。因此,在这种情况下,您的数组索引号会指向您需要的内存块。但事实并非如此。这些数据结构既不是静态的,也不是预先分配的。所以你需要一些方法从内存地址跳转到内存地址。这些数据结构解决了这个问题。
我希望能够解决问题。
来源: https://en.wikipedia.org/wiki/Hash_table http://www.makelinux.net/books/lkd2/app01lev1sec1