pid_hashfn(x) 负责进程号映射到哈希表中的位置。理论上哈希函数何以直接查找哈希表,但是哈希函数存在冲突问题,linux内核提供了哈希查找函数find_pid().(kernel/pid.c中)
struct pid * fastcall find_pid(enum pid_type type, int nr)
{
struct hlist_node *elem;
struct pid *pid;
hlist_for_each_entry(pid, elem,
&pid_hash[type][pid_hashfn(nr)], pid_chain) {//第type个哈希表中的第//pid_hashfn(nr)个元素。
if (pid->nr == nr)
return pid;
}
return NULL;
}
在创建进程是又设计到向哈希表中添加进程,有函数attach_pid()提供(kernel/pid.c中)
nr值不存在是直接插入到nr对应链表的表头
当nr存在时插入对应从表的表尾。
int fastcall attach_pid(task_t *task, enum pid_type type, int nr)
{
struct pid *pid, *task_pid;
task_pid = &task->pids[type];
pid = find_pid(type, nr);
if (pid == NULL) {
hlist_add_head(&task_pid->pid_chain,
&pid_hash[type][pid_hashfn(nr)]);
INIT_LIST_HEAD(&task_pid->pid_list);
} else {
INIT_HLIST_NODE(&task_pid->pid_chain);
list_add_tail(&task_pid->pid_list, &pid->pid_list);
}
task_pid->nr = nr;
return 0;
}
进程销毁时从哈希表中移除进程,由函数detach_pid()完成(kernel/pid.c中)
void fastcall detach_pid(task_t *task, enum pid_type type)
{
int tmp, nr;
nr = __detach_pid(task, type);//解除进程task与第type个哈希表之间的关联
if (!nr)
return;
for (tmp = PIDTYPE_MAX; --tmp >= 0; )
if (tmp != type && find_pid(tmp, nr))
return;
free_pidmap(nr);//释放该进程号nr
}
Linux内核学习笔记之进程进程的组织形式(2)
内容版权声明:除非注明,否则皆为本站原创文章。