task-凯发app官方网站

凯发app官方网站-凯发k8官网下载客户端中心 | | 凯发app官方网站-凯发k8官网下载客户端中心
  • 博客访问: 752930
  • 博文数量: 144
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 1150
  • 用 户 组: 普通用户
  • 注册时间: 2014-03-17 14:32
个人简介

小公司研发总监,既当司令也当兵!

文章分类

全部博文(144)

相关博文
  • ·
  • ·
  • ·
  • ·
  • ·
  • ·
  • ·
  • ·
  • ·
  • ·

分类: linux

2016-02-17 20:02:46

原文地址:task_struct解析(三) 进程id 作者:kenvifire

task_struct 中有这么几个和进程id有关的字段
  1. pid_t pid;
  2. pid_t tgid;
  3. ....
  4. struct pid_link pids[pidtype_max];
pid和tgid是表示该进程的全局进程id的,前者是当前进程的id号,后者是当前进程所在线程组的线程组id。
而后者则是指向pid哈希表的链接,里面存储了命名空间相关的信息。
1、进程命名空间
include/linux/pid_namespace.h里有pid_namespace的定义:
  1. struct pid_namespace {
  2.     struct kref kref;
  3.     struct pidmap pidmap[pidmap_entries];
  4.     int last_pid;
  5.     struct task_struct *child_reaper;
  6.     struct kmem_cache *pid_cachep;
  7.     unsigned int level;
  8.     struct pid_namespace *parent;
  9. #ifdef config_proc_fs
  10.     struct vfsmount *proc_mnt;
  11. #endif
  12. #ifdef config_bsd_process_acct
  13.     struct bsd_acct_struct *bacct;
  14. #endif
  15. };
我们这里只关心其中的child_reaper,level和parent这三个字段
child_reaper:指向的是当前命名空间的init进程,每个命名空间都有一个作用相当于全局init进程的进程。
level:代表当前命名空间的等级,初始命名空间的level为0,它的子命名空间level为1,依次递增,而且子命名空间对父命名空间是可见的。
parent:指向父命名空间的指针
因此命名空间的结构如下所示:


2、upid
正是命名空间的作用,使得进程能够分配到不同的命名空间中去,而且进程在自己所在的命名空间中有着局部的pid,这就是局部pid,因此各个命名空间的pid有可能重复,也即是一个pid可能为多个进程使用,在pid.h文件中定义了一个用来关联pid和命名空间的结构体.
  1. struct upid {
  2.     /* try to keep pid_chain in the same cacheline as nr for find_vpid */
  3.     int nr;
  4.     struct pid_namespace *ns;
  5.     struct hlist_node pid_chain;
  6. };
其中nr表示id具体的值;
ns是指向命名空间的指针;
pid_chain是指向pid哈希列表的指针,用于关联对于的pid

3、pid
在pid中又对使用该pid的task进行了关联
  1. struct pid
  2. {
  3.     atomic_t count;
  4.     unsigned int level;
  5.     /* lists of tasks that use this pid */
  6.     struct hlist_head tasks[pidtype_max];
  7.     struct rcu_head rcu;
  8.     struct upid numbers[1];
  9. };
count 是指使用该pid的task的数目;
level 表示可以看到该pid的命名空间的数目,也就是包含该进程的命名空间的深度
tasks[pidtype_max]是一个数组,每个数组项都是一个散列表头,分别对应以下三种类型:
  1. enum pid_type
  2. {
  3.     pidtype_pid,
  4.     pidtype_pgid,
  5.     pidtype_sid,
  6.     pidtype_max
  7. };
numbers[1]是一个upid的实例数组,每个数组项代表一个命名空间,用来表示一个pid可以属于不同的命名空间,该元素放在末尾,可以向数组添加附加的项。


总结
1、多个task_struct可以共用一个pid
2、一个pid可以属于不同的命名空间
那么最终,linux下进程命名空间和进程的关系结构如下:


可以看到,多个task_struct指向一个pid,同时pid的hash数组里安装不同的类型对task进行散列,并且一个pid会属于多个命名空间。

参考资料:
1、《深入linux内核架构》
2、
阅读(2652) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~
")); function link(t){ var href= $(t).attr('href'); href ="?url=" encodeuricomponent(location.href); $(t).attr('href',href); //setcookie("returnouturl", location.href, 60, "/"); }
网站地图