进程的状态

进程是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 多线程,克隆线程

进程状态的转换

进程的运行过程就是进程的状态转换过程。

linx-ps-status

  1. R 可执行状态: 处于该状态的进程才可在CPU上运行,进程的task_struct结构被放入对应CPU的可执行队列中等待进程调度器为其选择合适的CPU来执行
  2. S 可中断的睡眠状态: 处于此状态的进程被挂起,等待某种事件的发生(如等待信号量,等待Socket连接),它的task_struct被放入到对应事件的等待队列中。当等待事件发生时,对应的等待队列中的一个或多个进程将会被唤醒。
  3. D 不可中断的睡眠状态: 处于此状态的进程不响应外部异步信号,这种状态的进程常被用于内核级别的处理流程
  4. T 暂停状态或跟踪状态: 收到SIGSTOP信号的进程会进入暂停状态,再收到SIGCONT信号会进入可执行状态。跟踪状态是一个特殊的状态,和调试进程有关,处于跟踪状态的进程不会响应SIGSTOP信号
  5. Z 退出状态 退出状态的进程饱和 僵死进程task_zombie和被销毁进程task_dead