Linux进程状态和变迁

一、进程的状态表述:

   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 
   6: /* in tsk->exit_state */ 
   7: #define EXIT_ZOMBIE 16 
   8: #define EXIT_DEAD 32 
   9: /* in tsk->state again */ 
  10: #define TASK_NONINTERACTIVE 64 
  11: #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_DEAD(死亡状态)
    task_struct->state == EXIT_DEAD是一个特殊情况,为了避免混乱就引入了这个新的状态。EXIT_DEAD就只能用于->exit_state字段。一个进程在退出(调用do_exit())时,state字段都被置于TASK_DEAD状态。
  6. EXIT_ZOMBIE(僵死进程)
    该状态是task_struct->exit_state字段的值,表示进程的执行被终止,但是服进程还没有发布wait4()或waitpid()系统调用来返回有关死亡的进程信息。发布wait()类系统调用前,内核不能丢弃包含在死亡进程描述符中的数据,因为父进程可能还需要它来取得进程的退出状态。
  7. EXIT_DEAD(僵死撤销状态)
    该状态也是task_struct->exit字段的值,表示进程的最终状态。由于父进程刚发出wait4()或waitpid()系统调用,因而进程由系统删除,为了防止其他执行线程在同一个进程也执行wait()类系统调用,而把进程的状态由僵死状态(EXIT_ZOMBIE)改为撤销状态(EXIT_DEAD)。

 

你可能感兴趣的:(Linux内核设计与实现)