Skip to content

Linux process states explanation

Linux进程类型

用户进程

User processes: 系统里大多数进程都是用户进程。用户进程由通常的用户账户启动,并在用户空间(user space)当中执行。在没有获得额外许可的情况下,通常用户进程无法对处理器进行特殊访问,或是访问启动进程的用户无权访问的文件。

守护进程

Deamon processes: 守护进程通常是后台程序,它们往往由一些持续运行的服务来管理。守护进程可以用来监听请求,而后访问某些服务。举例来说,httpd 这一守护进程监听访问网络页面的请求。守护进程也可以用来自行启动一些任务。例如,crond 这一守护进程会在预设的时间点启动计划任务。守护进程通常由系统在启动时拉起,而后一直运行到系统关闭。当然,守护进程也可以按需启动和终止,以及让守护进程在特定的系统运行级别上执行,或是在运行过程中触发重新加载配置信息。

内核进程

Kernel processes: 内核进程仅在内核空间(kernel space)当中执行。内核进程与守护进程有些相似;它们之间主要的不同在于:内核进程对内核数据结构拥有完全的访问权限。此外,内核进程不如守护进程灵活:修改配置文件并触发重载即可修改守护进程的行为;但对于内核进程来说,修改行为则需要重新编译内核本身。

Linux进程状态

static const char * const task_state_array[] = {
"R (running)", /* 0 */
"S (sleeping)", /* 1 */
"D (disk sleep)", /* 2 */
"T (stopped)", /* 4 */
"t (tracing stop)", /* 8 */
"X (dead)", /* 16 */
"Z (zombie)", /* 32 */};

运行状态(R)

TASK_RUNNING: 在这个状态中,进程正在CPU中执行,或者在运行队列(run queue)中等待运行。

停止状态(T)

TASK_STOPPED or TASK_TRACED: 进程由于特定的信号(如SIGINT、SIGSTOP)而挂起就会处于这个状态,等待恢复信号,如SINCONT。

可中断的等待状态(S)

TASK_INTERRUPTIBLE: 这类进程处于阻塞状态,一旦达到某种条件,就会变为运行状态。同时该状态的进程也会由于接收到信号而被提前唤醒进入到运行状态。

不中断的等待状态(D)

TASK_UNINTERRUPTIBLE: 与 可中断的等待状态 含义基本类似,唯一不同的是处于这个状态的进程对信号不做响应。不中断的等待状态最典型的例子是进程等待磁盘I/O操作。

僵尸状态(Z)

TASK_DEAD - EXIT_ZOMBIE: 也就是僵尸进程,每个进程在结束后都会处于僵尸状态,等待父进程调用进而释放资源,处于该状态的进程已经结束,但是它的父进程还没有释放其系统资源。

一个僵尸进程产生的过程是:父进程调用 fork()创建子进程后,子进程运行直至其终止,它立即从内存中移除,但进程描述符仍然保留在内存中(进程描述符占有极少的内存空间)。子进程的状态变成EXIT_ZOMBIE,并且向父进程发送SIGCHLD信号,父进程此时应该调用 wait()系统调用来获取子进程的退出状态以及其他的信息。在 wait()调用之后,僵尸进程就完全从内存中移除了。因此一个僵尸进程存在于其终止到父进程调用 wait()函数这个时间之间,一般很快就消失了,但如果编程不合理,父进程就不会调用 wait()等系统调用来收集僵尸进程,那么这些进程会一直存在内存中。最后形成一直滞留的僵尸进程。

退出状态(X)

TASK_DEAD - EXIT_DEAD: EXIT_DEAD状态是非常短暂的,几乎不可能通过ps命令捕捉到。

深入了解

  • 《理解Unix进程》

Disclaimer
  1. License under CC BY-NC 4.0
  2. Copyright issue feedback me#imzye.me, replace # with @
  3. Not all the commands and scripts are tested in production environment, use at your own risk
  4. No privacy information is collected here
Try my iOS App