【进程与线程】进程的状态
在操作系统中,进程是执行中的程序实例。进程在其生命周期中会经历不同的状态,操作系统根据进程的执行情况和资源调度,将进程划分为多个状态。 这些状态帮助操作系统更加高效地管理 CPU 和系统资源。
进程的状态:就绪态,运行态,阻塞态,暂停态,僵尸态,死亡态。
1. 就绪态(Ready)
进程已准备好运行,但由于 CPU 正忙,暂时无法获得 CPU 执行权。
此时进程已获得所有必要的资源(如内存、I/O 等),只需等待 CPU 调度。
多个进程可能同时处于就绪状态,操作系统会将它们放入 就绪队列 中,按照调度算法(如时间片轮转、优先级调度)分配 CPU。
转换条件
- 从 创建态 转入(进程被创建后,获得所需资源)。
- 从 运行态 转入(时间片用尽,重新进入就绪队列等待调度)。
2. 运行态(Running)
进程正在 CPU 上执行,属于唯一占用 CPU 的状态。
在单核 CPU 系统中,任意时刻只有一个进程处于运行态。
在多核 CPU 系统中,每个核心上可以有一个进程处于运行态。
转换条件
- 从 就绪态 转入(进程被调度器分配到 CPU)。
- 转换到其他状态:
- 阻塞态:进程执行过程中需要等待某些资源(如 I/O 请求)。
- 就绪态:时间片用尽,CPU 被剥夺。
- 死亡态:进程执行完成。
3. 阻塞态(Blocked/Waiting)
进程正在等待某些资源或事件(如 I/O 设备、文件锁、信号)完成,暂时无法继续执行。
阻塞态的进程会停止占用 CPU,释放调度权,直到等待的事件完成。
典型场景:等待磁盘 I/O 完成、等待用户输入、网络数据传输。
转换条件
- 从 运行态 转入(进程请求资源未满足)。
- 转换到 就绪态:等待的资源或事件完成,进程重新进入就绪队列。
4. 暂停态(Stopped/Suspended)
进程被 人为暂停 或 系统挂起,处于暂停执行的状态。
进程不会占用 CPU,不会继续执行,但仍保留所有资源(如内存)。通常由用户或系统发出暂停信号(如 SIGSTOP)导致。暂停态是人为控制的,与阻塞态不同,暂停态不是因为等待资源。
转换条件
- 从 运行态 或 就绪态 转入(接收到暂停信号)。
- 转换到其他状态:
- 就绪态:接收到继续信号(如 SIGCONT)。
- 死亡态:进程被终止。
在 Linux
中,使用 Ctrl+Z
将一个前台进程暂停(进入暂停态),可以通过 fg
或 bg
恢复执行。
5. 僵尸态(Zombie)
进程已 完成执行,但其父进程尚未通过系统调用(如 wait()
)回收它的退出状态,导致进程仍保留在进程表中,成为僵尸进程。
僵尸态的进程已释放大部分资源(如内存),只占用进程表中的一个条目。
僵尸进程无法被直接杀死,只有父进程回收其状态或父进程退出后由 init 进程接管时,僵尸态才会消失。
转换条件
- 从 运行态 转入(进程完成执行)。
- 转换到 死亡态:父进程回收退出状态。
避免僵尸进程:① 父进程应主动调用 wait()
或 waitpid()
获取子进程的退出状态。② 使用信号处理机制自动回收子进程(如 SIGCHLD 信号处理)。
6. 死亡态(Terminated/Exited)
进程已完成执行或被终止,所有资源被系统回收,进程完全退出。
死亡态是进程的最终状态,一旦进程进入死亡态,就无法再恢复。
转换条件
从 运行态 转入(正常执行完成);从 其他状态 转入(进程被强制终止,如接收到 SIGKILL 信号)。
综合:进程状态转换图
+-----------+
| 创建态 |
+-----------+
|
v
+-----------+ +-----------+ +-----------+
| 就绪态 | <--> | 运行态 | ---> | 阻塞态 |
+-----------+ +-----------+ +-----------+
进程已准备好运行, 进程正在 CPU 上执行 进程等待某些资源或事件完成,
| 暂时无法继续执行。
但等待 CPU 调度。 | |
v |
+-----------+ |
| 暂停态 | <------------+
+-----------+ 进程被人为或系统挂起,暂停执行。
|
v
+-----------+
| 僵尸态 | 进程已完成执行,但父进程未回收其退出状态。
+-----------+
|
v
+-----------+
| 死亡态 | 进程已终止,所有资源被回收。
+-----------+
查看进程状态
在 Linux 系统中,可以使用 ps
或 top
查看进程的状态:
ps -eo pid,stat,cmd
# STAT 列 表示进程状态:
# R:运行态(Running)。
# S:阻塞态(Sleeping)。
# D:不可中断的阻塞态(如等待 I/O)。
# T:暂停态(Stopped)。
# Z:僵尸态(Zombie)。
输出:
PID STAT CMD
1234 R ./myprogram # 正在运行
5678 S sleep 100 # 阻塞等待
9101 T ./myprogram # 暂停
1121 Z [myprogram] <defunct> # 僵尸进程
综上。进程的状态反映了其生命周期中的不同阶段,操作系统通过这些状态高效地管理进程和资源,理解这些状态及其转换有助于熟悉操作系统调度机制,并在实际开发中避免问题(如僵尸进程)。
以上。仅供学习与分享交流,请勿用于商业用途!转载需提前说明。
我是一个十分热爱技术的程序员,希望这篇文章能够对您有帮助,也希望认识更多热爱程序开发的小伙伴。
感谢!