分类: LINUX
2013-07-28 13:46:41
在分析pid、task的关系时,需要首先了解一些概念。
pid是一个数据结构,表示一个进程的进程号,或者表示一个组的组号(对于组来说,组号就是组长的进程号,这个可以从文件sched.h的四个函数task_pid、 task_pgrp、 task_session看出来,这三个函数也描述了如何从一个task得到其不同的pid结构的方法);
pid是一个结构变量,它真正表示的进程号或者组号是在pid结构中的一个upid结构的nr元素,因为pid只能表示一个nr号,由于namespace的存在,一个pid结构中可能有多个upid结构变量,这些变量对应的是不同namespace中的nr号,虽然nr号不同,但它们表示的内容却是一致的;
task_struct表示一个进程,进程有多重需求,首先它自己有自己的进程号,其次它可能在某一个组内,每个组都有一个pid结构,因此一个task_struct可能会对应对个pid结构,通过struct pid_link pids[PIDTYPE_MAX]关联不同的pid结构。这也决定了一个pid结构可能有多个身份,首先它对应一个进程,因此在struct hlist_head tasks[PIDTYPE_PID]中可以找到它的task_struct;其次它表示一个组,因此在struct hlist_head tasks[PIDTYPE_PGID]和struct hlist_head tasks[PIDTYPE_SGID]应该还连接了该组的task_struct结构。
pid_hash是一个hash表,它管理这这些所有的组号、进程号,可以根据号码迅速查找对应的pid结构
pid_bitmap隶属于namespace,即一个namespace对应一个bitmap。
如何从给一个给定的pid.upid.nr号得到它的对应的task_struct呢?在解决这个问题前必须先明白两个问题:1,这个nr是哪个namespace的?这个nr是一个进程号,还是一个组号,如果是进程号,那么很明显它对应的进程只有一个,如果是组号,那么这个组内部则有很多的进程,你需要的是哪一个进程?