linux进程状态小结

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/recall_yesterday/article/details/52781986

本文章是看过微信中的一篇文章叫做linux进程状态浅析后的小的笔记式总结.
众所周知的操作系统的进程的状态有就绪,运行,阻塞典型的三态.
那么在linux下进程的状态可以具体的分为下面的几种

1.TASK_Running 运行

2.TASK_INTERRUPTIBLE 可中断的休眠

3.TASK_UNINTERRUPIBLE 不可中断的休眠

4.TASK_STOPPED/TASK_TRACED 暂停/跟踪

5.TASK_ZOMBIE/TASK_DEAD 僵死/死亡

那么首先说TASK_RUNNING.这个进程状态就是所说的运行状态,它包括两种类型的进程,一个是正在运行的进程,一个是可以被运行但是没有被调度的进程.这二者都是TASK_RUNNING;

然后是TASK_INTERRUPIBLE,这个状态是处于休眠但是可以被打断.在这种情况下会发生,比如当进程等待一个socket的连接或者信号量时,进程会进行休眠但是,这种休眠是可以打断的,也就是说,当有一个socket连接时会通过信号来唤醒正在休眠的进程,也就解释了打断休眠的意思了.

相对的TASK_UNINTERRUPIBLE是不可中断的休眠;这种状态是不允许被异步信号打断的,即使是kill -9也不行.为什么需要这个状态呢?因为这个状态被应用在内核中某些场景中,比如当进程需要对磁盘进行读写,而此刻正在DMA中进行着数据到内存的拷贝,如果这时进程休眠被打断(比如强制退出信号)那么很可能会出现问题,所以这时进程就会处于不可被打断的状态下;

关于TASK_STOPPED/TASK_TRACED都是进程暂停的状态.
比如当进程收到SIGSTOP信号时会进入到stopped状态.而
traced状态是当进程被跟踪时处于的状态,比如用gdb调试时,
当进程处于断点时而停下来那么进程状态就是traced…
其中TASK_STOPPED状态也可以通过SIGCONT信号再次运行.而跟踪状态的进程则需要ptrace系统调用才能进一步向下进行.

TASK_DEAD/TASK_ZOMBIE 这两个进程则是非常熟悉的了,其中当父进程存在而子进程退出时子进程会处于僵尸状态,
如果父进程调用了wait/waitpid那么就会彻底死亡了,TASK_DEAD

猜你喜欢

转载自blog.csdn.net/recall_yesterday/article/details/52781986