一、进程的状态表述:
#define TASK_RUNNING 0
#define TASK_INTERRUPTIBLE 1
#define TASK_UNINTERRUPTIBLE 2
#define TASK_STOPPED 4
#define TASK_TRACED 8
/* in tsk->exit_state */
#define EXIT_ZOMBIE 16
#define EXIT_DEAD 32
/* in tsk->state again */
#define TASK_NONINTERACTIVE 64
#define TASK_DEAD 128
二、状态详解:
1、TASK_RUNNING(运行状态):
表示进程正在被CPU执行,或者已经准备就绪随时可由调度程序调度执行。若此时进程没有被CPU执行,则称其处于就绪状态。当一个进程在内核代码中运行时,我们称其处于内核态,当一个进程正在执行用户自己的代码时,我们称其处于用户态。当系统资源已经可用时,进程就被唤醒而进入准备运行状态,也就是就绪状态。这些状态在内核中表示方法相同,都被称为TASK_RUNNING状态。当一个进程刚被创建后就处于TASK_RUNNING状态。
2、TASK_INTERRUPTIBLE(可中断睡眠状态):
进程处于等待状态,不会被调度执行。直到等待的资源可用(或等待某条件为真)或者系统产生一个中断或进程收到一个信号时,进程就被唤醒继而进入就绪状态(TASK_RUNNING)。
3、TASK_UNINTERRUPTIBLE(不可中断的睡眠状态):
与TASK_INTERRUPTINLE状态的唯一区别就是该状态不可被收到的信号唤醒。这种状态很少用到,但在一些特殊的情况下(进程必须等待,直到一个不能被中断的事件发生,发送硬盘I/O要求而等待I/O完成的状态,等待TTY终端的输入的状态等),这种状态是很有用的。例如,当进程打开一个设备文件,其相应的设备驱动程序开始探测相应的硬件设备时会用到这种状态。探测完成以前,设备驱动程序不能被中断,否则,硬件设备会处于不可预知的状态。在状态通常在进程需要不受干扰的等待或者所等待的事件会很快发生时使用。
4、TASK_STOPPED(暂停状态):
当进程收到SIGSTOP、SIGTSTP、SIGTTIN、SIGTTOU信号后就会进入TASK_STOPPED状态。可向其发送SIGCONT信号让进程转换到可运行状态。5、TASK_TRACED(跟踪状态):
进程的执行已由debugger程序暂停。当一个进程被另一个进程监控时(例如debugger执行ptrace()系统调用监控一个测试程序),任何信号都可以把这个进程置于TASK_TRACED状态。
6、 TASK_NONINTERACTIVE(不可交互睡眠状态):
Speaking of task states, there is now a TASK_NONINTERACTIVE flag which is used to mark non-interactive sleeps. It should be set alongside TASK_INTERRUPTIBLE or TASK_UNINTERRUPTIBLE in cases where the fact that a process is sleeping does not provide any information on whether it is interactive or not. Its initial use is for processes waiting on pipe buffers; the idea is to keep batch tasks using pipes (such as kernel compiles) from looking more interactive than they are. (Toward)
该状态是在2.6.14中才引入的进程状态,用于描述进程处于一种不可交互的睡眠状态。该状态必须和 TASK_INTERRUPTIBLE 或者 TASK_UNINTERRUPTIBLE状态组合使用。它在进程处于睡眠状态并且无论它是否可以交互都不提供任何信息的时候使用。它最初是在进程等待管道缓冲区的时候使用,这样是为了防止使用管道的进程(例如内核编译)获得更或的交互。
7、TASK_DEAD(死亡状态):
task_struct->state == EXIT_DEAD是一个特殊情况,为了避免混乱就引入了这个新的状态。EXIT_DEAD就只能用于->exit_state字段。一个进程在退出(调用do_exit())时,state字段都被置于TASK_DEAD状态。
8、EXIT_ZOMBIE(僵死进程):
该状态是task_struct->exit_state字段的值,表示进程的执行被终止,但是服进程还没有发布wait4()或waitpid()系统调用来返回有关死亡的进程信息。发布wait()类系统调用前,内核不能丢弃包含在死亡进程描述符中的数据,因为父进程可能还需要它来取得进程的退出状态。
9、EXIT_DEAD(僵死撤销状态):
该状态也是task_struct->exit字段的值,表示进程的最终状态。由于父进程刚发出wait4()或waitpid()系统调用,因而进程由系统删除,为了防止其他执行线程在同一个进程也执行wait()类系统调用,而把进程的状态由僵死状态(EXIT_ZOMBIE)改为撤销状态(EXIT_DEAD)。