下面是进程状态转换图:
下面是5种常见状态的状态码与说明:
R running or runnable (on run queue)
D uninterruptible sleep (usually IO)
S interruptible sleep (waiting for an event to complete)
Z defunct/zombie, terminated but not reaped by its parent
T stopped, either by a job control signal or because it is being traced
内核源码中对进程状态的详细定义:
201 #define TASK_RUNNING 0
202 #define TASK_INTERRUPTIBLE 1
203 #define TASK_UNINTERRUPTIBLE 2
204 #define __TASK_STOPPED 4
205 #define __TASK_TRACED 8
206 /* in tsk->exit_state */
207 #define EXIT_ZOMBIE 16
208 #define EXIT_DEAD 32
209 /* in tsk->state again */
210 #define TASK_DEAD 64
211 #define TASK_WAKEKILL 128
212 #define TASK_WAKING 256
213 #define TASK_PARKED 512
214 #define TASK_STATE_MAX 1024
TASK_RUNNING
该状态表示进程处于可运行状态,也就是说要么正在CPU中运行,要么在runqueue队列中等待运行。
runqueue队列是scheduler里的数据结构,按序保存着就绪着的进程。
TASK_INTERRUPTIBLE
该状态表示进程处于可中断的睡眠状态。该进程正处在睡眠,但是可以被任何信号唤醒。当信号将该进程唤醒后,进程会去对信号做出响应。
TASK_UNINTERRUPTIBLE
该状态表示进程处于不可中断的睡眠状态。该进程正处于睡眠,专心等待某一个事件(一般是IO事件),并且不希望被其他信号唤醒。
EXIT_ZOMBIE
该状态是该进程变为僵尸进程,即其父进程没有对该进程的结束信号进行处理,见
http://blog.csdn.net/ojshilu/article/details/21537621
__TASK_STOPPED
该状态表示进程被挂起,主要用于调试。当进程收到了信号SIGSTOP后,会将其状态由 TASK_RUNNING 变成 __TASK_STOPPED,当该进程接收到了 SIGCONT 信号后, 再回到可运行状态。
对于内核来讲没有阻塞的概念,因为内核一直都在运行着。
详细参考:Linux/include/linux/sched.h