linux的程序雜湊表

2021-06-26 22:52:08 字數 1274 閱讀 2078

linux系統中每個程序由乙個程序id標識,在核心中對應乙個task_struct結構的程序描述符,系統中所有程序的task_struct通過鍊錶鏈結在一起,在核心中,經常需要通過程序id來獲取程序描述符,最簡單的方法可以通過遍歷task_struct鍊錶並對比id的值來獲取,但這樣效率太低,尤其當系統中執行很多個程序的時候。

linux核心通過pid雜湊表來解決這一問題,能快速的通過程序id獲取到程序描述符。

pid雜湊表包含4個表,因為程序描述符包含了表示不同型別pid的字段,每種型別的pid需要自己的雜湊表。

enum pid_type

;核心定義了4個全域性的hash表,分別對應4種型別

static struct hlist_head

*pid_hash

[pidtype_max

];struct pid

;其中nr代表id號,pid_chain用於鏈結衝突元素。對於pgid,tgid來說,對於同一程序組的多個程序來說,所有程序的pgid是相同的,核心中很多操作是針對程序組進行的操作,通過pid_list欄位,可以將所有相同id的程序鏈結在一起。

task_struct結構中擁有乙個pids欄位,它是包含pidtype_max個元素的pid結構陣列,hash表的鏈結關係由pid結構完成,通過pid結構可獲取包含該結構的task_struct描述符。

struct task_struct ;

pid雜湊表的鏈結關係如下圖所示,本圖中描述了以tgid為關鍵字建立的hash表。

通過id獲取程序描述符由find_task_by_pid_type函式完成,**如下,其首先根據指定id的型別,獲取對應雜湊表的表頭,然後計算id所對應的hash slot並遍歷獲取到對應的pid結構,然後呼叫pid_task獲取到包含該pid結構的task_struct描述符。

注:本文的**來自2.6.11版本核心,後因命名空間擴充套件等原因,pid雜湊表的實現已經發生了改變,但原理上應該是相同的。

task_t *find_task_by_pid_type(int type, int nr)

struct pid * fastcall find_pid(enum pid_type type, int nr)

return null;

}#define pid_task(elem, type) \

list_entry(elem, struct task_struct, pids[type].pid_list)

Linux程序PID雜湊表

linux 系統中每個程序由乙個程序id標識,在核心中對應乙個task struct結構的程序描述符,系統中所有程序的task struct通過鍊錶鏈結在一起,在核心中,經常需要通過程序id來獲取程序描述符,最簡單的方法可以通過遍歷task struct鍊錶並對比id的值來獲取,但這樣效率太低,尤其...

Linux Linux程序PID雜湊表

linux系統中每個程序由乙個程序id標識,在核心中對應乙個task struct結構的程序描述符,系統中所有程序的task struct通過鍊錶鏈結在一起,在核心中,經常需要通過程序id來獲取程序描述符,最簡單的方法可以通過遍歷task struct鍊錶並對比id的值來獲取,但這樣效率太低,尤其當...

雜湊表(雜湊表)的定義

chapter 雜湊表 雜湊表 1.雜湊表 雜湊表 的定義 2.雜湊表是怎麼進行查詢的?3.雜湊函式設計 直接定址法 4.雜湊函式設計 除留餘數法 5.雜湊衝突處理 開放定址法 6.雜湊衝突處理 鏈位址法 7.雜湊表的鏈位址法實現 8.linux核心中的hash與bucket 9.引入雜湊桶的概念來...