1.进程标识符构成的哈希表
内核使用一个进程描述符来表示一个进程,因此通过进程描述符的地址来访问一个进程是最方便的. 这里主要是用哈希表来完成进程号到进程描述符地址之间的映射.
内核中设置了PIDTYPE_MAX个不同的哈希表(4个),这四个哈希表保存在数组pid_hash中,
static struct hlist_head *pid_hash[PIDTYPE_MAX];
pid_type是一个枚举内型。
enum pid_type
{
PIDTYPE_PID,//进程号哈希表
PIDTYPE_TGID,//线程组号哈希表
PIDTYPE_PGID,//进程组号哈希表
PIDTYPE_SID,//会话号表
PIDTYPE_MAX
};
在进程描述符中有一个成员变量 pids,定义如下:
struct pid pids[PIDTYPE_MAX];
struct pid{
int nr;
struct hlist_node pid_chain;
struct list_head pid_list;
};
pid_chain构成一个链表,表中的nr值不同,哈希函数将这些nr值映射到哈希表中的同一位置,这个链表就是主链。(nr值本身就是进程号)
pid_list将具有相同nr值的进程联系在一起构成从链。例如可以讲同一个线程组的所有线程联系起来。