Linux内核学习笔记之进程进程的组织形式(2)

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
}

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wwxpxf.html