Chinaunix首页 | 论坛 | 博客
  • 博客访问: 41398
  • 博文数量: 8
  • 博客积分: 165
  • 博客等级: 入伍新兵
  • 技术积分: 96
  • 用 户 组: 普通用户
  • 注册时间: 2011-06-21 16:54
文章分类

全部博文(8)

文章存档

2014年(1)

2013年(1)

2012年(1)

2011年(5)

分类: LINUX

2011-08-19 15:48:22

谈到task_struct结构体,可以说她是linux内核源码中最复杂的一个结构体了,成员之多,占用内存之大。
鉴于她的复杂,我们不能简单的亵渎,而是要深入“窥探”.
下面先介绍这些复杂成员中的一员,state域
  1. struct task_struct {
  2.     volatile long state;    /* -1 unrunnable, 0 runnable, >0 stopped */
  3.     ......
  4. };
根据《Understanding the linux kernel .third edit》中的介绍:state域能够取5个互为排斥的值(通俗一点就是这五个值任意两个不能一起使用,只能单独使用)。
  1. #define TASK_RUNNING        0
  2. #define TASK_INTERRUPTIBLE    1
  3. #define TASK_UNINTERRUPTIBLE    2
  4. #define TASK_STOPPED        4
  5. #define TASK_TRACED        8

现在一个一个介绍                                                                 TASK_RUNNING : 这个状态是正在占有cpu或者处于就绪状态的进程才能拥有。一旦某一个进程她的state域的值等于TASK_RUNNING,那么这个进程要么是正在运行,要么就是已经就绪,正在等待cpu时间片的调度。

TASK_INTERRUPIBLE :进程因为等待一些条件而被挂起进(阻塞)而所处的状态。这些条件主要包括:硬中断、资源、一些信号……,一旦等待的条件成立,进程就会从该状态(阻塞)迅速转化成为就绪状态,也就是state域的值变为TASK_RUNNING。

TASK_UNINTERRUPIBLE :其实他和TASK_UNINTERRUPIBLE 大致相同,除了传递一个信号和中断所引起的效果不同。对于处于TASK_UNINTERRUPIBLE状态的进程,哪怕我们传递一个信号或者有一个外部中断都不能唤醒他们。只有它所等待的资源可用的时候,他才会被唤醒。这个标志很少用,但是并不代表没有任何用处,其实他的作用非常大,特别是对于驱动刺探相关的硬件过程很重要,这个刺探过程不能被一些其他的东西给中断,否则就会让进城进入不可预测的状态。

TASK_STOP :进程的执行被停止,当进程接收到SIGSTOP、SIGTTIN、SIGTSTP或者SIGTTOU信号之后就会进入该状态。

TASK_TRACED :进程执行被调试程序所停止,当一个进程被另外的进程所监视,每一个信号都会让进城进入该状态。

其实还有两个附加的进程状态既可以被添加到state域中,又可以被添加到exit_state域中。只有当进程终止的时候,才会达到这两种状态。 

  1. #define EXIT_ZOMBIE        16
  2. #define EXIT_DEAD        32

 

EXIT_ZOMBIE :进程已经终止,但是它的父进程还没有调用wait4或者waitpid函数来获得有关进程终止的有关信息,在调用这两个函数之前,内核不会丢弃包含死去进程的进程描述符的数据结构的,防止父进程某一个时候需要着一些信息。

EXIT_DEAD :进程被系统释放,因为父进程已经调用了以上所提到的函数。现在内核也就可以安全的删除该进程的一切相关无用的信息了。

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