以下取自ps命令的man page,然后加上了我自己的理解。
PROCESS STATE CODES
Here are the different values that the s, stat and state output specifiers (header "STAT" or "S") will display to describe the state of a process:
D uninterruptible sleep (usually IO): 当进程处于等待硬件IO时,处于这种状态。如果系统同时有大量进程处于D状态,且长时间不发生变化,那很有可能是出现了IO瓶颈,可以用IO相关的命令进一步查看。还有一种情况,我曾经遇到过的是主机通过NFS访问存储server,由于存储server出了性能问题,也会导致需要访问NFS文件系统的进程处于D状态,用top命令,应该能看到CPU的%wa会非常高。
R running or runnable (on run queue):正在运行或者正在等待被调度
S interruptible sleep (waiting for an event to complete): 可中断状态。据统计,绝大多数进程多数时间是处于这种状态,而不是我们以为的RUNNING状态。进程处于这种状态是理想的、健康的。比如我们的网络服务段程序的代码在调用accept()函数获取客户端的连接,而此时客户端没有新的连接进来,或者调用read()函数从已建立的socket 连接中读取数据,但是socket中还没有任何传过来的数据,此时进程都会处于S状态;再比如程序调用sleep函数,或者一个线程正在等另外一个线程持有的一个锁,也会处于这种可中断状态。(线程从Linux操作系统的角度看,也是一个进程哦,他叫light weight process)
T stopped by job control signal:这里说是stopped状态,实际上进程处于暂停或者挂起状态。比如在我们SSH终端运行一个ping命令,这时我们按住ctrl + z,这时就会发送一个SIGSTOP信号给在正在当前终端frontend运行的ping进程,然后操作系统收到该信号时,就会将该ping进程挂起,后边我们用"fg %1" 或者"bg %1"命令(1是job id,假设我们的ping命令job id是1),就会恢复ping进程的运行,当然你也可以通过kill命令,发送一个SIGCONT信号给ping进程,也能恢复他的运行。也许用suspended 替代stopped来描述处于暂停、挂起状态的进程也许更合适一些,毕竟英文stopped和terminated,dead翻译过来都可以叫‘终止’,都差不多意思,容易混淆。
t stopped by debugger during the tracing: 也是挂起状态,只不过进程挂起是由一些debug工具,比如gdb导致的,恢复运行,也不能通过发送SIGCONT信号,只能由debug工具来恢复运行。
W paging (not valid since the 2.6.xx kernel)
X dead (should never be seen)
Z defunct ("zombie") process, terminated but not reaped by its parent:这是所谓的僵尸进程。在子进程退出后,会释放所有资源除了task_struct,task_struct是内核为每个进程、线程分配的一个数据结构,也叫PCB、进程控制块、进程描述符等,不同类型的操作系统有不同的叫法。因为进程退出后,会返回一个退出状态给父进程,这个状态就保存在子进程的task_struct中。当子进程退出后,如果父进程不去处理子进程的返回信息,或者干脆父进程也退出了,那这些已经完成运行、等待父进程处理的子进程,就成了僵尸进程。僵尸进程一般不需要我们手工做特殊处理,因为操作系统的init进程(用户空间的第一个进程)会最终处理这些僵尸进程。说一个体外话,我们在SSH中断的shell命令提示符下,输入$?命令,可以获取上一个命令的返回结果,这个结果实际上就是shell在执行上一个命令时,shell为该命令创建了一个子进程,shell作为父进程。当命令运行结束后,shell作为父进程会从上一个命令的task_struct中获取到了该返回值,并保存在"$?"中。
另外我们在redhat/centos等Linux系统中,用ps、top命令查看进程状态时,除了上边列出的状态,我们有可能还会看到下边的状态,以下是这些状态的解释,可以不用做太多关注,重点关注上边的这些状态。
For BSD formats and when the stat keyword is used, additional characters may be displayed:
< high-priority (not nice to other users)
N low-priority (nice to other users)
L has pages locked into memory (for real-time and custom IO)
s is a session leader
l is multi-threaded (using CLONE_THREAD, like NPTL pthreads do)
+ is in the foreground process group