通过top命令查看进程状态,其中S列表示进程状态。
不可中断进程
S列的取值D是Disk Sleep的缩写,即不可中断状态睡眠,一般表示进程正在跟硬件交互,并且交互过程不允许被其他进程或中断打断。
不可中断状态时为了保证进程数据与硬件状态一致,并且正常情况下,不可中断状态在很短时间内就会结束。所以短时的不可中断状态进程可以忽略。
但是,当进程长时间都处于不可中断状态时,系统可能出现问题了。可以使用dstat、pidstat等工具,确认是不是磁盘I/O问题,进而排查相关的进程和磁盘设备。
僵尸进程
S列的取值Z是Zombie的缩写,表示僵尸进程。就是进程实际上已经结束了,但是父进程还没有回收它的资源(比如进程描述符、PID等)。
僵尸进程是多进程应用很容易碰到的问题。正常情况下,当一个进程创建子进程后,它应该通过系统调用wait()或者waitpid()等待子进程结束,回收子进程的资源;而子进程在结束时,会向它的父进程发送SIGCHILD信号,所以父进程还可以注册SIGCHILD信号的处理函数,异步回收资源。
如果父进程没有这么做,或是子进程执行太快,父进程还没来得及处理子进程状态,子进程就已经提前退出,那这时的子进程就会变成僵尸进程。
通常,僵尸进程持续的时间都比较短,在父进程回收它的资源后就会消亡;或者在父进程退出后,由init进程回收后也会消亡。
一旦父进程没有处理子进程的终止,还一直保持运行状态,那么子进程会一直处于僵尸状态。大量的僵尸进程会用尽PID进程号,导致新进程不能创建,所以这种情况一定要避免。
僵尸进程是因为父进程没有回收子进程的资源而出现的,所以要解决僵尸进程,要找出父进程,在父进程里解决。