[英]Understanding the PID hash table in the linux kernel
內核將所有進程存儲在任務列表中。 任務列表是一個循環的雙向鏈接列表。 這意味着列表中的每個元素都有指向下一個元素和上一個元素的指針。 第一項鏈接到最后一項,反之亦然。 從概念上講,它可以看作是一個圓圈。
每個任務中都有一個進程描述符,其中包含您感興趣的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.