linux 进程学习笔记-进程状态

task_struct的state字段记录的进程的状态,可分为如下几种: 

  

#define TASK_RUNNING            0 

可运行状态。这是 “进程正在被CPU运行” 和 “进程正在可运行队列中等待被CPU运行” 统称。也可以将它们拆开成“RUNNING”和“READY”两种状态。 

  

#define TASK_INTERRUPTIBLE       1 

可中断的睡眠状态。当进程等待某个条件(比如某个资源,中断,信号)而被挂起时就处于该状态,当条件得到满足时,进程将会重新返回到TASK_RUNNING状态。 

  

#define TASK_UNINTERRUPTIBLE    2 

不可中断的休眠状态。与TASK_INTERUPTIBLE类似,但不同的是其不会响应信号,其会一直等待直到条件得到满足。 

  

#define TASK_ZOMBIE             4 

僵死状态。进程的执行被终止,但还未完全退出时的状态。系统总会假设一个进程退出前其父进程始终对其感兴趣,所以当进程被终止时,系统会通知父进程来收集相关信息,当父进程收集完毕后(发布wait()调用后),进程废除过程才会继续进行以丢弃数据。(如果子进程退出时,父进程已经不存在了,在父进程的工作会由init进程代理) 

  

#define TASK_STOPPED            8 

暂停状态。有一些信号可以让进程暂停被执行而处于暂停状态,比如SIGSTOP (Stop executing temporarily),  SIGTSTP (Terminal stop signal),  SIGTTIN (Background process attempting to read from tty),  SIGTTOU  (Background process attempting to write to tty). 另外,当一个进程被另外一个进程监视(ptrace)时,任何信号都会让被监视进程处于TASK_STOPPED状态(一个典型例子是程序的DEBUG时,被调试程序就经常处于该状态,看到有的资料上也将该状态分离出来,叫着TASK_TRACED) 

  

结合下面这个图我们可以看看一个进程的生命周期: 

 

调用fork函数而创建一个新进程后,如果紧接着调用了exec族函数的话,新进程会被放置到可执行队列等待被CPU执行,如果仅仅是调用fork函数,那么新进程的状态和父进程的状态完全相同(Run in User Mode 或Run in Kernel Mode)。 

当进程在用户模式运行时,如果发生了系统调用,则进程会进入到内核模式(Run in Kernel Mode)。 假设此时的是一个磁盘文件读取操作,而该操作比较慢,进程将放弃CPU而进入休眠状态(Sleeping)并且时机成熟(读取完成,数据就绪)而被唤醒。 

当进程退出(比如调用exit()函数)后,其会变成僵死进程而进入Zombie状态。 

 

posted on 2015-11-24 10:32  zyz913614263  阅读(251)  评论(0编辑  收藏  举报

导航