linux进程状态

来源:互联网 发布:汪清县淘宝特产 编辑:程序博客网 时间:2024/06/07 07:25
1.R: TASK_RUNNING,正在运行或者处于就绪状态很多操作系统教科书将正在CPU上执行的进程定义为RUNNING状态、而将可执行但是尚未被调度执行的进程定义为READY状态,这两种状态在linux下统一为 TASK_RUNNING状态。例子:ps -aux//会看到ps这个程序命令的运行状态是R,+一会再说2.S :TASK_INTERRUPTIBLE,可中断的睡眠状态进程因为等待某事件发生而阻塞睡眠,比如:等待socket连接、等待信号量、sleep、pause。我理解就是程序员司空见惯的阻塞等待。3.D :TASK_UNINTERRUPTIBLE,不可中断的睡眠状态进程处于睡眠状态,但是此刻进程是不可中断的,即进程不响应异步信号。TASK_UNINTERRUPTIBLE状态存在的意义就在于,内核的某些处理流程是不能被打断的。
例子:
#include <stdio.h>#include <unistd.h>int main(){printf("pid = %d\n",getpid());if(vfork() == 0){sleep(1000);}return 0;}
执行 ps -aux 查看父进程的状态即为D。此时在终端对父进程发送SIGKILL信号(kill xxx)不能终止进程。
4.TTASK_STOPPED or TASK_TRACED,暂停状态或跟踪状态
(1)向进程发送一个SIGSTOP、SIGTSTP、SIGTTIN、SIGTTOU信号,它就会因响应该信号而进入TASK_STOPPED状态。除非该进程本身处于TASK_UNINTERRUPTIBLE状态而不响应信号,SIGSTOP与SIGKILL信号一样,是强制的,不允许用户进程通过signal系列的系统调用重新设置对应的信号处理函数。
向进程发送一个SIGCONT信号,可以让其从TASK_STOPPED状态恢复到TASK_RUNNING状态。
(2)当进程正在被跟踪时,它处于TASK_TRACED这个特殊的状态。“正在被跟踪”指的是进程暂停下来,等待跟踪它的进程对它进行操作。比如在gdb中对被跟踪的进程下一个断点,进程在断点处停下来的时候就处于TASK_TRACED状态。而在其他时候,被跟踪的进程还是处于前面提到的那些状态。
(3)对于进程本身来说,TASK_STOPPED和TASK_TRACED状态很类似,都是表示进程暂停下来。而TASK_TRACED状态相当于在TASK_STOPPED之上多了一层保护,处于TASK_TRACED状态的进程不能响应SIGCONT信号而被唤醒。只能等到调试进程通过ptrace系统调用执行PTRACE_CONT、PTRACE_DETACH等操作(通过ptrace系统调用的参数指定操作),或调试进程退出,被调试的进程才能恢复TASK_RUNNING状态。
例子:
#include <stdio.h>#include <unistd.h>int main(){printf("pid = %d\n",getpid());pause();return 0;}
执行 gcc main.c -o main,运行./main;
ps -aux 查看进程的 stat 是S;
终端发送信号 kill -SIGSTOP xxx(xxx是进程id号),再 ps -aux 查看进程stat是T;
终端发送信号 kill -SIGCONT xxx,再 ps -aux 查看进程stat恢复S。
执行gcc -g main.c -o main,然后gdb main;
ps -axu查看对应进程id,stat是T。
5.ZTASK_DEAD - EXIT_ZOMBIE,退出状态,进程成为僵尸进程
子进程已经结束,而父进程还没处理子进程退出时(如:wait子进程,处理SIGCHLD信号),子进程进程的状态。
例子:
#include <stdio.h>#include <unistd.h>int main(){printf("pid = %d\n",getpid());if(fork() > 0){pause();}return 0;}
终端 ps -aux 查看子进程的stat是Z。
6.ps中的STAT的其他状态
W   正在换页(2.6.内核之前有效)
X   死进程 (未开启)
<   高优先级(not nice to other users)
N   低优先级(nice to other users)
L   页面锁定在内存(实时和定制的IO)
s   一个信息头
l   多线程(使用 CLONE_THREAD,像NPTL的pthreads的那样)
+   在前台进程组