Linux进程状态和变迁

本文详细介绍了Linux进程的五种状态:运行状态、可中断睡眠状态、不可中断睡眠状态、暂停状态和死亡状态,包括各状态的含义及转换情况。例如,进程在等待资源时进入可中断或不可中断睡眠状态,收到特定信号可恢复运行;当进程收到特定信号如SIGSTOP时会暂停,而父进程调用wait系列函数后,进程变为僵死状态直至被彻底撤销。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、进程的状态表述:

   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)。

 

F0AEE7F0B45B98E8D9AE2043A2E8A87BEA62B5C5[5]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值