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(running):当进程正在被CPU执行,或已经准备就绪随时可由调度程序执行,则称该进程为处于运行状态(running)进程要么在运行中,要么在运行队列里面,并不一定是正在运行。
S(sleeping):等待某一事件的完成
D(disk sleep):磁盘休眠状态,这个进程通常是等待IO的结束
T(stopped):暂停状态,当进程收到信号SIGSTOP、SIGTSTP、SIGTTIN或SIGTTOU时就会进入暂停状态。可向其发送SIGCONT信号让进程转换到可运行状态。进程被暂停,我们可以使用指令kill -SIGSTOP 还有kill -SIGCONT 来是进程被暂停和被继续。
Z(zombie):僵死状态,当进程已停止运行,但其父进程还没有询问其状态时,则称该进程处于僵死状态。
下面提供了一段创建僵尸进程的例子
#include<stdio.h>
#include<stdlib.h>
int main()
{
int id = fork();
if(id > 0)
{
printf("Parent is sleeping....\n");
sleep(5);
}
if(id == 0)
{
printf("son exit");
exit(EXIT_SUCCESS);
}
return 0;
}
程序执行的结果是,首先打印出了Parent is sleeping….,然后另换一行打印出son exit,接着持续了5秒钟之后程序退出。
我们在运行上面的程序的时候,我们可以打开终端,然后输入指令进行查看
ps -ax | grep myprocess
会发现我们进程处于僵尸状态
这里的子进程就是一个僵尸进程,可以这样理解,就是我们 的子进程已经退出了,但是子进程退出了之后无家可归,就是一个飘移的孤魂野鬼一样,所以这里是一个僵尸进程。
PS:
进程已死亡,但父进程没有收尸,该进程就成僵尸进程
僵尸进程不打开任何文件,几乎不占内存,但是占据进程表的资源,进程表记录pid、进程状态、CPU时间等
僵尸状态是每个子进程结束时必经的状态
系统监控中出现大量僵尸进程,应检查其父进程代码