Linux 进程状态

Linux 进程状态是平时排查问题、程序稳定性测试的基础知识,查看进程状态的常用工具有 top 和 ps。以 top 的输出为例:
Linux 进程状态_第1张图片
S 列(Status)表示进程的状态,图中可见 D、R、S 状态,实际工作中,你会遇到的状态还会很多,它们及代表意义如下:

R:Running / Runnable,表示进程在 CPU 的就绪队列中,正在运行或正等待运行;

D:Dick sleep,表示不可中断睡眠状态(Uninterruptible sleep),一般说明进程正跟硬件交互中,交互过程不允许被其他进程中断;

S:Interruptble sleep,可中断睡眠状态,表示进程因为等待某个事件而被系统挂起,如等待 IO、主动调用 sleep 函数;

I:idle,不可中断睡眠的内核线程线程。同样是不可中断睡眠状态,D 表示用户空间进程,I表示内核线程。

T 或 t:Stopped / Traced,表示进程处于暂停或被跟踪状态,比如我们用 GDB 调试某个程序,那么该进程就处于被跟踪状态;

X:Dead,进程消亡,在 top 或 ps 中我们看不到这种状态;

除上述进程状态,还有诸如 Ss+、D+、S<、Ssl、SN,S 和 D 代表的意义已知,Ss+ 中的 + 表示前台进程组(进程组指的是一组相互关联的进程,如每个子进程是父进程所在组的成员,这就是一种关联关系),s 表示该进程是一个会话的领导进程(会话指的是共用同一个控制终端的一个或者多个进程组),< 表示高优先级进程,N 表示低优先级进程,l 表示线程加锁。

最后我们还需要了解一下僵尸进程和孤儿进程。

我们知道,子进程是由父进程创建的,且二者运行时相互独立,父进程无法预测子进程什么时候退出,而且当一个进程退出时内核并不会全部释放该进程占据的资源:打开的文件描述符、占用的内存等会被释放,进程号、退出状态和进程运行时间等信息依然会被保留,这些信息需要父进程使用 wait() 或者 waitpid() 调用时才会释放,我们称之为回收子进程信息。

那么就会衍生两个现象:子进程退出了,父进程没有及时回收子进程信息,子进程处于僵尸进程状态,当系统存在大量的僵尸进程就会导致系统的 PID 进程号耗尽,无法创建新进程;

子进程还没有退出,父进程提前退出了,子进程则处孤儿进程状态,孤儿状态被系统 init 进程接管,即孤儿进程的父进程 ID 为 1。

进程状态为 z(zombie)时表示该进程为僵尸进程,孤儿进程则可以通过查看其父进程名称确定是否为 init :

$ ps ax -o ppid -o pid -o command -o stat | grep ${程序名称} | grep -v grep

本文首发自公众号「 LinuxOK 」,ID 为:Linux_ok。
关注公众号第一时间获取更新,分享不仅技术文章,还有关于职场生活的碎碎念。

你可能感兴趣的:(Linux系统/网络编程,linux,进程状态)