在Linux系统中,进程状态对于系统调度、资源分配和管理非常重要,因为它表示了进程当前的执行状况和资源使用情况。在Linux 系统中使用ps -aux 命令可观察到进程的当前状态,在 STAT 列中,会列出进程当前的状态代码;
也可以通过/proc/PID/status查看State行了解到单个进程的状态,例如:
| cat /proc/1/status |
Linux 是一个多用户多任务的操作系统,可以同时运行多个用户的多个程序,就必然会产生多进程,而每个进程会有不同的状态。Linux 的进程通常有以下 6 种状态。
⚫R (Running/Ready):进程处于运行态或就绪状态,只有在该状态的进程才可能在 CPU 上运行。而同一时刻可能有多个进程处于可执行状态;根据是否在CPU上运行,进一步细分成RUNNING和READY两种状态。处于READY状态的进程表示,它们随时可以投入运行,只不过由于CPU资源有限,调度器暂时并未选中它运行
⚫S (Sleeping):可中断的睡眠状态,处于这个状态的进程因为等待某种事件的发生而被挂起,一般来说可以通过信号来唤醒;
⚫D (Deep Sleep):不可中断的深度睡眠状态,处于这种状态的进程不能响应异步信号(无法被信号唤醒),只能等待相应的条件成立才能结束睡眠状态;
⚫T (Stopped):暂停状态或跟踪状态,一般可通过信号将进程暂停,如 SIGSTOP信号;处于暂停态的进程是可以恢复进入到就绪态的,如收到 SIGCONT 信号;
⚫Z (Zombie):退出状态,进程成为僵尸进程,僵尸态进程其实指的就是僵尸进程,指该进程已经结束、但它的父进程还没有通过系统调用 wait() 或 waitpid() 来回收其退出状态信息。
⚫X (Exit):退出状态,进程即将被销毁,其资源正在被回收。在这个状态下,进程的所有资源(如内存、文件描述符等)会被释放。
进程状态转换:进程是动态的活动的实例,这就意味着进程的状态之间可以发生转换;进程在其生命周期中会经历不同的状态,这些状态反映了进程当前的执行情况。由于操作系统需要有效管理资源和调度任务,进程的状态会根据不同的事件和条件发生变化。每次状态的变化都是由于外部条件或内部逻辑的影响。
就绪 → 运行:当调度程序选择一个就绪进程并分配 CPU 资源时,该进程进入运行状态。
运行 → 就绪:当前正在运行的进程如果时间片耗尽,或被其他高优先级进程抢占,则会回到就绪状态。
运行 → 阻塞:当进程请求 I/O 操作或其他资源时,它会进入阻塞状态,等待相应的事件。
阻塞 → 就绪:一旦所等待的事件发生,进程会从阻塞状态转回就绪状态,等待再次被调度。
运行 → 终止:进程正常完成任务或因错误而被强制终止,转入终止状态,系统清理其资源。
就绪 → 终止:如果进程在就绪状态下长时间未被调度,可能会被系统终止。
运行 → 暂停:通过信号(如 SIGSTOP)可以将进程暂停,进入暂停状态。
暂停 → 就绪:当进程收到恢复信号(如 SIGCONT),它会回到就绪状态,准备再次执行。
僵尸 → 终止:当父进程调用 wait() 收回子进程的状态信息后,僵尸进程会被清理,进入终止状态。
293