下面是进程状态转换图:

下面是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



Logo

更多推荐