簡體   English   中英

了解Linux內核中的PID哈希表

[英]Understanding the PID hash table in the linux kernel

在此處輸入圖片說明

《理解Linux內核第三版》一書的這一部分解釋說,內核不是為了查找PID而搜索進程列表,而是引入了4個哈希表,每種哈希表對應一種。

據我了解,表的每個元素都是PID的哈希。 但是,這如何使搜索變得容易呢? 例如,給定一個PID,是否存在4個哈希表,因為僅在該PID類型的哈希中搜索而不是在所有PID的同一個條件下搜索會更快? 另外,為什么哈希有幫助? 搜索哈希不是比搜索簡單數字難嗎?

那么,這4個表之一中的條目究竟是什么? 它們是過程描述符嗎? 我理解他們。 並且在每個進程描述符中,存在一種結構,該結構鏈接到處於相同狀態的其他類似進程,例如,處於相同組和相同狀態的進程。

是這個嗎?

內核將所有進程存儲在任務列表中。 任務列表是一個循環的雙向鏈接列表。 這意味着列表中的每個元素都有指向下一個元素和上一個元素的指針。 第一項鏈接到最后一項,反之亦然。 從概念上講,它可以看作是一個圓圈。

每個任務中都有一個進程描述符,其中包含您感興趣的PID信息。他們說的是,通常,要找到您要殺死的進程,您必須遍歷任務列表,查看每個任務的每個過程描述符的PID字段,直到找到要查找的任務為止。 您無法直接通過PID引用它們,因為您不知道它在內存中的位置。 這就是鏈接的目的。 這樣任務列表就不需要占用連續的內存空間。 只需通過重新鏈接即可進行插入和刪除。 每個過程都知道IT在內存中的位置。 並且它可以使用其在內存中的位置來跟蹤鏈接,直到找到所需的過程為止。

這就是所謂的線性時間搜索。 最壞的情況是,給定N個元素,將需要N次操作才能找到結果。 而且您在描述效率時總是假設平均最壞的情況。 在搜索是否有大量數據時,線性時間效率很低。

他們的意思是說,有4個表,您可以在其中通過散列函數將PID(取決於目標對象)放入PID中,檢查結果位置的表,並確切地知道任務的內存地址。任務列表。 這是一項操作。 緩解沖突是哈希函數的工作。 但平均最壞的情況稱為恆定時間。 快多了。

搜索沒有簡單的數字。 您正在遍歷位於不同內存位置的數據結構。 如果您有C數組,則將它們預先分配在堆棧中連續的內存空間中。 因此,在這種情況下,您的數組索引號將指向您立即需要的內存塊。 但事實並非如此。 這些數據結構既不是靜態的也不是預先分配的。 因此,您需要某種方式從內存地址跳轉到內存地址。 這些數據結構要解決的是什么。

我希望這可以解決問題。

資料來源: https : //zh.wikipedia.org/wiki/哈希表 http://www.makelinux.net/books/lkd2/app01lev1sec1

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM