Linux程序PID雜湊表

2022-05-02 21:15:08 字數 1327 閱讀 8387

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的結構來鏈結各個程序,其定義如下:

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 Linux程序PID雜湊表

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

linux核心pid雜湊表

首先看一下kernel中的雜湊表的資料結構,雜湊表頭 cpp struct hlist head 煉表頭是hlist head,注意這是乙個雙向鍊錶但不迴圈。first欄位指向第乙個節點。雜湊表節點 cpp struct hlist node 這裡的next指向下乙個節點,pprev欄位存放了上乙個...

linux的程序雜湊表

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