马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
进程状态是系统编程里最容易被「背下来但用不对」的知识点。这篇从三个基本状态讲起,细化到 Linux 里真正的生命周期各阶段,再落到 top 命令里那些字母(D、I、R、S、T、t、Z)分别对应什么、看到它们该担心什么。
一、概述
在多任务并发编程中,进程是一个非常重要的概念。应用程序运行时都以进程的方式启动,再展开为多进程或多线程的架构。涉及系统编程时各平台实现有差异,这里以 Linux 为例。
在 Linux 中,进程是程序的一个实例化(也就是运行起来后),是系统进行资源分配和调度的基本单元。每个进程独立占有资源,会被分配独立的内存空间、CPU 核、文件描述符等。进程之间通过进程间通信(IPC)机制进行通信和同步——这一点和线程有本质区别。多进程编程就是同一程序里创建并运行多个进程,以实现并发处理。
二、三个基本状态
- 就绪:进程的资源准备好了,但尚未被分配 CPU,处在等待状态。
- 运行:进程被分配了 CPU 时间片,正在分配的 CPU 核上执行。
- 阻塞(睡眠):进程需要的资源尚未满足,此时会放弃占用的 CPU。
2.1 状态怎么转换
- 就绪的进程被分配到 CPU → 变成运行态。
- 运行态的进程 CPU 时间片用完 → 回到就绪态,等下次分配。
- 运行态调用了
sleep 或读写磁盘等会阻塞的操作 → 进入阻塞态。
- 阻塞态的进程达到唤醒条件(定时器超时、磁盘数据加载进缓存)→ 回到就绪态。
这是一台有限状态机,不是简单的单向流程。
三、生命周期:把状态再细化
进程启动之后,通过一系列状态标识它当前所处的阶段,直到进程结束。细化之后整个生命周期分为:
- 创建:进程被创建,但尚未准备好执行。
- 就绪:已准备好执行,但还没分配到 CPU 时间。
- 运行:正在执行。
- 可中断的阻塞:在等管道、锁这类资源,收到信号时可以被唤醒。
- 不可中断的阻塞:正在等 I/O 动作完成,不能被信号唤醒。
- 终止(Terminated):进程已执行完成或被终止。
四、状态怎么查看:top 命令
用 top 看实时运行状态,进程当前状态就是 S 列的值。取值如下:
S -- Process Status
D = uninterruptible sleep(不可中断睡眠)
I = idle(空闲/就绪空闲)
R = running(运行中)
S = sleeping(可中断睡眠)
T = stopped by job control signal(被任务控制信号停止)
t = stopped by debugger during trace(被调试器暂停)
Z = zombie(僵尸进程)
- D:对应不可中断的阻塞;I:就绪空闲状态。
- R:正在运行;S:对应可中断的阻塞。
- T:被任务控制信号停止;t:进程被调试器接管时暂停。
- Z:僵尸进程。
看一段真实输出:
top - 09:04:55 up 436 days, 58 min, 19 users, load average: 3.65, 3.84, 3.86
Threads: 1512 total, 5 running, 1502 sleeping, 3 stopped, 2 zombie
%Cpu(s): 7.0us, 13.6sy, 0.2ni, 77.3id, 0.0wa, 0.1hi, 1.8si, 0.0st
MiB Mem: 31672.7 total, 260.3 free, 12496.5 used, 18915.9 buff/cache
MiB Swap: 1020.0 total, 0.0 free, 1020.0 used, 16843.8 avail Mem
PID USER PR NI VIRT RES SHR %CPU %MEM TIME+ COMMAND
1463957 senllang 20 0 2071732 1.2g 1644 R 75.6 3.7 25023:00 ./toadb-0-01-M2
1463958 senllang 20 0 2071732 1.2g 1644 R 75.6 3.7 25068:32 ./toadb-0-01-M2
1463959 senllang 20 0 2071732 1.2g 1644 S 1.3 3.7 25609:34 ./toadb-0-01-M2
3125409 root 20 0 0 0 0 D 1.0 0.0 1:80 [kworker/u32:0+flush-8:0]
能看出 R 和 S 两种状态。留意最后那行 D 状态的内核线程——这是典型的内核工作队列在刷盘。
五、看到不同状态该怎么做
- D 状态时间长:说明进程卡在不可中断 I/O(通常是磁盘病态、NFS 挂了、设备没响应),关注点应放在存储性能上,必要时优化缓存策略或排查挂载。
- Z(僵尸)堆积:父进程没
wait 回收子进程,得去查父进程为什么没回收,别去杀僵尸本身——杀了也没用。
- T 状态:多半是人为
Stop 过(Ctrl+Z 或 kill -STOP),kill -CONT 恢复即可。
- S 状态占比过高:大量进程在等锁、等管道,属于正常的并发等待,但要确认不是死锁——配合 pidstat、strace 看它们在等什么。
- R 但是慢:不是状态问题,是 CPU 争抢或计算本身重。
六、小结
Linux 平台的进程基本状态经过细化后,对应生命周期里的各阶段:进程从创建启动后就处在一个有限状态机中,在就绪、运行、可中断阻塞、不可中断阻塞之间转换,直到进程终止。理解这张状态图,再看 top/ps 里的那些字母,就知道该去查 CPU、内存还是磁盘,而不是对着状态栏发呆。
qidao123.com企服评测-应用市场 编辑提示 |