进程---------进程描述符(2)

进程间的关系:

         程序创建的进程有父/子关系,如果一个进程创建多个子进程,则子进程之间有兄弟关系。进程0和进程1是由内核创建的,进程1(init)是所有进程的祖先。进程描述符中有几个字段标示进程间的亲属关系及非亲属关系:

亲属关系:

real_parent: 指向创建p的进程的描述符,若p的父进程不存在,则指向进程1的描述符。(如果用户运行了一个后台进程且退出shell,后台进程就会成为init的子进程)

parent:指向p的当前父进程(p退出时必须向父进程发信号)

children:链表的头部,链表中所有元素都是p创建的子进程

sibling:指向兄弟进程链表中的下一个元素或者前一个元素的指针

非亲属关系:

group_leader:p所在进程组的领头进程的进程描述符

signal->pgrp:p所在进程组的领头进程的pid

tgid:p所在线程组的领头进程的pid

signal->session:p的登陆会话领头进程的pid

ptrace_children:链表的头,该链表包含所有被debugger程序跟踪的p的子进程

ptrace_list:指向所跟踪进程其实际父进程链表的前一个和下一个元素

pidhash表及链表

为了从pid导出对应的进程描述符指针,设置了4个散列表,因为进程描述符包含了标示不同类型pid的字段。

hash表的类型         字段名         说明

PIDTYPE_PID          pid             进程的pid

PIDTYPE_TGID       tgid             线程组领头进程的pid

PIDTYPE_PGID       pgid           进程组领头进程的pid

PIDTYPE_SID       session        会话领头进程的pid

内核初始化期间动态地为4个散列表分配空间,一个散列表的长度依赖于可用RAM的容量。

但是散列表会发生冲突,linux采用链表来处理冲突的pid:每一个表项都是由冲突的进程描述符组成的双向链表。采用链表,是因为系统中的进程数远远小于32768,大部分表项不会被使用。

为了跟踪进程间的关系,pid散列表为包含在一个散列表中的任何pid号定义进程链表。

组织进程

运行队列链表把处于TASK_RUNNING的进程组织到一起,而处于TASK_STOPED、EXIT_ZOMBIE或者EXIT_DEAD状态的进程没有建立链表,因为对它们的访问比较简单,可以通过pid或者特定父进程的子进程链表即可访问。

至于等待队列,标示一组睡眠的进程,当某一条件为真时内核唤醒它们,等待队列由双向链表实现,其元素包括指向进程描述符的指针。因为等待队列是由中断处理程序和主要内核函数修改,必须对其双向链表进行保护以免对其同时访问。同步时通过等待队列头中的lock自旋锁达到的。睡眠进程也分为两种:互斥进程(由内核有选择的唤醒)和非互斥进程(内核事件发生时唤醒)。

进程资源限制

每个进程都有一组相关的资源限制,指定了进程能使用的系统资源数量。对当前进程的资源限制存放在current->signal->rlim字段,该字段是类型为rlimit结构的数组,每个资源限制对应一个元素:

struct rlimit{

unsigned long rlim_cur;         //资源的当前资源限制

unsigned long rlim_max;        //资源限制所允许的最大值

};

只要用户注册进系统,内核就加载一个由超级用户拥有的进程,超级用户可以调用setrlimit()来设置rlim_max和rlim_cur。用户创建的每个新进程都会继承其父进程rlim数组的内容






  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值