Linux Process 2 ~ Hash
上一次有提到說,在 Linux Kernel 裡面找尋特定 PID 的 task 不是使用 sequential search,而是使用 hash 的方式,所以現在就來看看它的 hash 到底是怎麼做的! Kernel: 2.6.23 透過 PID 找尋 task 的 API 是下面那一支( kernel/pid.c ): struct task_struct *find_task_by_pid_type(int type, int nr) { return pid_task(find_pid(nr), type); } type? type 是什麼呢?幹嘛要有 type? 先來看看宣告( include/linux/pid.h )吧: enum pid_type { PIDTYPE_PID, // pid PIDTYPE_PGID, // pgid PIDTYPE_SID, // session PIDTYPE_MAX // 用來擔任 enum 的最大值(也許是作為檢查用) }; 後面的註解是我自己加上去的。簡單來說,Linux Kernel 不是單單建立一個 hash table,而是多個,所以要給一個 type 來說明要找哪一個 hash table。接下來就繼續看 pid_task 和 find_pid 到底是幹嘛囉~ struct task_struct * fastcall pid_task(struct pid *pid, enum pid_type type) { struct task_struct *result = NULL; if (pid) { struct hlist_node *first; first = rcu_dereference(pid->tasks[type].first); if (first) result = hlist_entry(first, struct task_struct, pids[(type)].node); } return result; } struct pid * fastcall find_pid(int ...