作者:zhan168 | 来源:互联网 | 2023-09-25 09:36
在学操作系统原理的时候,书上都说进程分为5种状态,分别为:新建状态、就绪状态、运行状态、阻塞状态,结束状态他们的转换关系如下图但是查了linux的进程状态之后,发现并不是那么回事,
在学操作系统原理的时候,书上都说进程分为5种状态,分别为:新建状态、就绪状态、运行状态、阻塞状态,结束状态
他们的转换关系如下图
但是查了linux的进程状态之后,发现并不是那么回事,linux进程状态分为7种,分别如下:
1、R (TASK_RUNNING):运行状态,即包括了上图中的就绪状态和运行状态
2、S (TASK_INTERRUPTIBLE):可中断的睡眠状态,即上图中的阻塞状态。在这个状态下进程是可被中断的,即收到信号之后可以执行信号处理函数
3、D (TASK_UNINTERRUPTIBLE):不可中断的睡眠状态。磁盘IO时会出现这种状态,在此状态下,进程是不能被中断的,即不能响应信号。但是可以响应外部硬件中断
4、T (TASK_STOPPED):停止状态。记得是大写的T。当进程收到SIGSTOP信号后就处于停止状态,可以发送SIGCONT信号让进程继续运行
5、X (TASK_DEAD – EXIT_DEAD):退出状态(死亡状态)。进程即将被销毁,通常是在父进程中设置SIGCHLD信号的handler为SIG_IGN,显式忽略了SIGCHLD信号。在使用ps命令查看进程状态时很难捕捉到这种状态
6、Z (TASK_DEAD – EXIT_ZOMBIE):僵尸状态。子进程先于父进程退出,并且父进程没有调用wait或waitpid回收子进程。此时子进程即处于僵尸状态
7、t(TASK_TRACED):跟踪状态,记得是小写的t,和停止状态只是大小写的区别。当利用gdb调试某个程序,程序停留在某个断点处时,就处于跟踪状态。
详细的状态描述参看这篇博文:Linux进程状态解析之R、S、D、T、Z、X
当利用命令:ps -aux 查看进程状态时,STAT字段还有其他的一些字符,其中部分表示如下:
<高优先级
N 低优先级
L 有pages在内存中locked。用于实时或者自定义IO。
s 进程领导者,其有子进程。
l 多线程
+ 位于前台进程组。
关于进程状态的描述,也可以使用命令 man ps 查看ps的说明文档,下面是我摘自ps说明文档的部分:
PROCESS STATE CODES
Here are the different values that the s, stat and state output specifiers (header &#8220;STAT&#8221; or &#8220;S&#8221;) will display to describe the state of a process:
D uninterruptible sleep (usually IO)
R running or runnable (on run queue)
S interruptible sleep (waiting for an event to complete)
T stopped by job control signal
t stopped by debugger during the tracing
W paging (not valid since the 2.6.xx kernel)
X dead (should never be seen)
Z defunct (&#8220;zombie&#8221;) process, terminated but not reaped by its parent
For BSD formats and when the stat keyword is used, additional characters may be displayed:
< high-priority (not nice to other users)
N low-priority (nice to other users)
L has pages locked into memory (for real-time and custom IO)
s is a session leader
l is multi-threaded (using CLONE_THREAD, like NPTL pthreads do)
+ is in the foreground process group