Chinaunix首页 | 论坛 | 博客
  • 博客访问: 263773
  • 博文数量: 38
  • 博客积分: 2208
  • 博客等级: 大尉
  • 技术积分: 374
  • 用 户 组: 普通用户
  • 注册时间: 2008-05-22 13:50
个人简介

没有介绍

文章分类

全部博文(38)

文章存档

2017年(2)

2014年(1)

2012年(2)

2011年(5)

2008年(28)

分类: LINUX

2008-08-03 10:03:08

1. 基本概念

每个进程控制块都有4个有关ID、含义不同的值,内核根据它们组成了4个全局的2维的HASH表,每个进程都要链接到这四个不同含义的Hash表当中。

/* 4种类型的值*/
enum pid_type
{
    PIDTYPE_PID,   进程的PID
    PIDTYPE_TGID,  线程组ID
    PIDTYPE_PGID,  进程组ID
    PIDTYPE_SID,   会话ID
    PIDTYPE_MAX
};

struct task_struct {
    ......
/* PID/PID hash table linkage. */
    struct pid pids[PIDTYPE_MAX];
    ......
}

2. Hash表的数组
四个全局的Hash表头位于: static struct hlist_head *pid_hash[PIDTYPE_MAX];
每一个Hash表都是一个数组,每一个元素是一个Hash值的链表头。默认有2048个元素

-----------------------------------------------------------------------------
| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |...|2047|  |
-----------------------------------------------------------------------------
 
3. Hash表数组元素的链表
我们拿进程的进程组ID(PIDTYPE_PGID)来举例,假如有3个进程组,分别是:

GROUP1:
PID PGIP HASH_PGID (根据进程组ID[PGIP]得到的Hash值)
10  10   hash(10)=88    (进程组领头)
11  10   hash(10)=88
12  10   hash(10)=88

GROUP2:
PID PGIP HASH_PGID (根据进程组ID[PGIP]得到的Hash值)
100  100   hash(100)=99    (进程组领头)
101  100   hash(100)=99
102  100   hash(100)=99

GROUP3:
PID PGIP HASH_PGID (根据进程组ID[PGIP]得到的Hash值)
550  550  hash(550)=88     (进程组领头)
551  550  hash(550)=88
552  550  hash(550)=88

struct pid
{
    /* Try to keep pid_chain in the same cacheline as nr for find_pid */
    /* 值 */
    int nr;

    /* HASH_PGID 值相同、且为进程组领头的进程链在这里,如PID值为10和550的两个进程会通过这个字段链接,这里可以认为是1个维度链,非进程组的进程的这个域为NULL(这里不考虑其它3种类型的值) */
    struct hlist_node pid_chain;

    /* PGID 值相同的进程链在这里,如上3个进程组,分别各自通过这个域链接起来,这里可以认为是第2个维度链 */
    /* list of pids with the same nr, only one of them is in the hash */
    struct list_head pid_list;
};

PGID的Hash表(即全局的pid_hash[PIDTYPE_PGID])

----
 0
----
 1
----
 2
----
 88  ---> 10  ---> 11 ---> 12      通过pid_list域链接
----      |
 ..       | 通过pid_chain域链接
----      |
 90       550 ---> 551 ---> 552    通过pid_list域链接
----
 ..
----
 99  ---> 100 ---> 101 ---> 102    通过pid_list域链接
----
2047
----


阅读(2258) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~