Linux的进程状态
2017-01-02
进程的状态 #
进程是Linux系统结构的基础,进程简单的理解就是一段程序的执行过程。系统的每一个进程会有不同的状态。
Linux源码中对进程状态的定义fs/proc/array.c:
1static const char * const task_state_array[] = {
2 "R (running)", /* 0 */
3 "S (sleeping)", /* 1 */
4 "D (disk sleep)", /* 2 */
5 "T (stopped)", /* 4 */
6 "t (tracing stop)", /* 8 */
7 "X (dead)", /* 16 */
8 "Z (zombie)", /* 32 */
9};
系统进程状态包括:
- R(running) 可执行状态, 进程处于运行或就绪状态。 Running or runnable (on run queue). 就绪状态表示线程已经分配到除CPU以外的资源,等CPU调度它时就可以马上执行了。同一时刻可能会有多个处于可执行状态的进程被放到CPU的可执行队列中,一个进程只会出现在一个CPU的可执行队列中。进程调度器从各个CPU的可执行队列中选择一个进程在该CPU上运行。
- S(sleeping) 可中断的睡眠状态
- D(disk sleep) 不可中断的深度睡眠状态。一般由IO引起,同步的IO在做读写时,CPU不能做其他事情,只能等待,如果程序采用异步IO,这种状态应该就很少见了。
- T(task_stopped or task traced)暂停状态或跟踪状态
- X(dead)
- Z(zombie) 僵尸状态
使用ps aux
查看得到的进程状态可能后边会跟上< N L
等字符,含义如下:
- < 高优先级
- N 低优先级
- L 有些页被锁进内存
- s 包含子进程
- + 位于后台的进程组;
- l 多线程,克隆线程
进程状态的转换 #
进程的运行过程就是进程的状态转换过程。
- R 可执行状态: 处于该状态的进程才可在CPU上运行,进程的task_struct结构被放入对应CPU的可执行队列中等待进程调度器为其选择合适的CPU来执行
- S 可中断的睡眠状态: 处于此状态的进程被挂起,等待某种事件的发生(如等待信号量,等待Socket连接),它的task_struct被放入到对应事件的等待队列中。当等待事件发生时,对应的等待队列中的一个或多个进程将会被唤醒。
- D 不可中断的睡眠状态: 处于此状态的进程不响应外部异步信号,这种状态的进程常被用于内核级别的处理流程
- T 暂停状态或跟踪状态: 收到SIGSTOP信号的进程会进入暂停状态,再收到SIGCONT信号会进入可执行状态。跟踪状态是一个特殊的状态,和调试进程有关,处于跟踪状态的进程不会响应SIGSTOP信号
- Z 退出状态 退出状态的进程饱和 僵死进程task_zombie和被销毁进程task_dead