Linux的进程状态
Linux的进程状态丰富多样,描述了进程在操作系统中的当前状况和等待的资源。以下是Linux进程的主要状态:
1. 可执行状态(R,TASK_RUNNING)
- 只有处于该状态的进程才可能在CPU上运行。同一时刻可能有多个进程处于可执行状态,这些进程的task_struct结构被放入对应CPU的可执行队列中。
- 注意,这里的可执行状态并不等同于正在执行,它还包括了已经准备好执行但尚未被CPU调度的进程。
2. 可中断的睡眠状态(S,TASK_INTERRUPTIBLE)
- 进程因等待某个条件(如I/O完成、互斥锁释放或某个事件发生)而无法继续执行。在这种状态下,进程可以被信号唤醒。
- 该状态是一种阻塞状态,但进程可以被外部信号中断并返回就绪状态。
3. 不可中断的睡眠状态(D,TASK_UNINTERRUPTIBLE)
- 进程也处于睡眠状态,但与可中断的睡眠状态不同,它不能被信号唤醒,除非等待的事件发生或设备断电等物理因素导致进程结束。
- 这种状态通常用于保护进程与设备交互的关键过程,避免被中断导致设备状态不一致。
4. 暂停状态或跟踪状态(T,TASK_STOPPED 或 TASK_TRACED)
- 进程被暂停执行,不会占用CPU资源。这种状态可以由SIGSTOP信号(kill -19)触发,也可以通过调试器(如gdb)设置断点来触发。
- 处于暂停状态的进程可以通过发送SIGCONT信号(kill -18)来恢复执行。
5. 僵尸状态(Z,TASK_DEAD - EXIT_ZOMBIE)
- 进程已经结束执行,但其task_struct结构(以及少量其他资源)仍保留在内存中,以便其父进程读取其退出状态等信息。
- 僵尸进程不占用CPU和内存资源(除了task_struct),但会占用进程号等标识符。直到其父进程通过wait系列系统调用来回收其资源,僵尸进程才会彻底消失。
6. 终止状态(X,TASK_DEAD 或 EXIT_DEAD)
- 这个状态在一些资料中可能不直接列出,但它表示进程已经彻底结束,所有资源都已被回收。在Linux中,进程结束后通常会先进入僵尸状态,然后再由父进程回收资源进入终止状态。