Linux进程状态

来源:互联网 发布:谷歌搜索引擎优化指南 编辑:程序博客网 时间:2024/05/22 14:11

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时间等
僵尸状态是每个子进程结束时必经的状态
系统监控中出现大量僵尸进程,应检查其父进程代码

原创粉丝点击