最近在看APUE过程中,遇到了一个有关于进程的“僵死进程”的状态。既然遇到了进程状态的问题,索性就查了查《Linux内核设计与实现》,里面给出了5种状态,分别是“TASK_RUNNING”、“TASK_INTERRUPTIBLE”、“TASK_UNINTERRUPTIBLE”、“__TASK_STOPPED”、“__TASK_TRACED”,但这5种状态中偏偏没有“僵死”这么一个状态,这到底是怎么一回事呢?

其实这个问题很好解决。我获取有关于进程状态信息的命令是什么?ps,没错。有关于进程状态的信息都来自于ps命令,那是否是ps的输出在误导我呢?

答案是肯定的,ps的输出确实在一定程度上误导了我,先来看看ps命令的输出,ps有关于进程状态的输出共有7中,分别是:

D uninterruptible sleep (usually IO) //不可中断睡眠

R running or runnable (on run queue) //正在执行或可执行

S interruptible sleep (waiting for an event to complete) //可中断睡眠状态

T stopped, either by a job control signal or because it is being traced //停止或追踪状态

W paging (not valid since the 2.6.xx kernel) //换页,但2.6之后内核已不再可用

X dead (should never be seen) //死亡,但应该永远也看不到

Z defunct ("zombie") process, terminated but not reaped by its parent //僵死状态(已经终止但还没有被父进程回收)

以上内容来自于man ps中“PROCESS STATE CODES”一节。

好了,以上就是ps的输出了,那么源码中是如何定义的呢?让我们来看看源码中是如何定义的,相关定义位于./include/linux/sched.h中:

#define TASK_RUNNING0

#define TASK_INTERRUPTIBLE1

#define TASK_UNINTERRUPTIBLE2

#define __TASK_STOPPED4 进程的执行被暂停,当进程接收到SIGSTOP、SIGTSTP、SIGTTIN、SIGTTOU信号后,进入暂停状态

#define __TASK_TRACED8

/* in tsk->exit_state */

#define EXIT_DEAD16

#define EXIT_ZOMBIE32

#define EXIT_TRACE(EXIT_ZOMBIE | EXIT_DEAD)

/* in tsk->state again */

#define TASK_DEAD64

#define TASK_WAKEKILL128

#define TASK_WAKING256

#define TASK_PARKED512

#define TASK_STATE_MAX1024

好了真相大白了,原来ps的输出与源码中的定义还不是完全一致的,这也就造成了我通过ps输出的结果与《Linux内核设计与实现》中写的内容不同。

既然是谈“僵死状态”,那就详细研究一下这个状态。“EXIT_ZOMBIE”状态表示进程的执行被终止(注意是已经终止了,而不是暂停,进程暂停了还能恢复),但是父进程还没有发布wait4()或waitpid()系统调用来返回有关死亡进程的信息。“EXIT_ZOMBIE”与“EXIT_DEAD”状态即可以存放在进程描述符的state字段中,也可以存放在exit_state字段中。

至此我们已经了解了ps的输出与内核源码的定义,让我们来看看他们之间的对应关系。

ps命令输出

内核源码定义

D    uninterruptible sleep (usually IO)

TASK_UNINTERRUPTIBLE

R    running or runnable (on run queue)

TASK_RUNNING

S    interruptible sleep (waiting for an event to complete)

TASK_INTERRUPTIBLE

T    stopped, either by a job control signal or because it is being traced

__TASK_STOPPED or __TASK_TRACED

W    paging (not valid since the 2.6.xx kernel)

X    dead (should never be seen)

可能是EXIT_DEAD或TASK_DEAD,这一点还无法确认

Z    defunct ("zombie") process, terminated but not reaped by its parent

EXIT_ZOMBIE or EXIT_TRACE

最后让我们看看各进程状态之间转化关系图。这幅图是我在网上的图的基础上稍加改变得到的。

linux进程状态1026,Linux进程状态分析相关推荐

  1. linux 进程状态 rl,Linux进程状态详解

    Linux进程状态详解 以下部分的代码示例,来自于Linux内核的0.11版本源码 在定义进程的数据结构task_struct时,有一个state字段是用来表示进程状态的,这里总结了下关于state字 ...

  2. linux进程状态a,Linux进程冻结技术

    Linux进程冻结技术 作者:itrocker 发布于:2015-11-24 15:01 分类:电源管理子系统 1什么是进程冻结 进程冻结技术(freezing of tasks)是指在系统hiber ...

  3. linux 进程状态 load,Linux - 系统指标 CPU load

    cpu load cpu load通常做为一个机器负载的衡量指标 cpu load是对使用或者等待cpu进程的统计(数量的累加).每一个使用(using)或者等待(waiting)CPU的进程(pro ...

  4. linux 进程状态 dw,Linux之PID状态信息是如何来的之详解PID stat文件

    摘要 在Linux上一切皆文件,哪怕你是硬件也是用文件的形式给呈现出来了,刚开始接触Linux的时候我对这话也是很莫名其妙,很难以理解,但是经过这么长时间的接触,平均每天有20%+的时间在Linux系 ...

  5. linux 进程状态ss,linux ss 命令用法说明

    ss 是 Socket Statistics 的缩写.ss 命令可以用来获取 socket 统计信息,它显示的内容和 netstat 类似.但 ss 的优势在于它能够显示更多更详细的有关 TCP 和连 ...

  6. Linux下进程状态转换,Linux进程状态转换图

    Linux进程状态 Linux内核中的进程状态 ◆运行状态(TASK_RUNNING) 指正在被CPU运行或者就绪的状态.这样的进程被成为runnning进程.运行态的进程可以分为3种情况:内核运行态 ...

  7. linux系统编程之进程概念(操作系统---管理,进程创建,进程状态,进程优先级, 环境变量,程序地址空间,进程O(1)调度方法)

    系统编程: 进程概念->进程控制->基础IO->进程间通信->进程信号->多线程 进程概念 冯诺依曼体系结构----现代计算机硬件体系结构 冯诺依曼体系结构----现代计 ...

  8. 【Linux操作系统】Linux进程状态和两个特殊进程

    文章目录 一.一套普适性的进程状态理论 1.运行 2.阻塞 3.挂起 二.一套具体的Linux进程状态 1.R-运行 2.S-睡眠 3.T-暂停 5.t-被追踪 三.僵尸进程和孤儿进程 1.僵尸进程 ...

  9. 操作系统原理,进程的基本状态,运行态,就绪态,等待态与转换模型,进程的其他状态,创建,终止,挂起与转换模型,Linux进程状态模型示例

    操作系统原理,进程的基本状态,运行态,就绪态,等待态与转换模型,进程的其他状态,创建,终止,挂起与转换模型,Linux进程状态模型示例 一.进程的三种基本状态: 运行态,就绪态,等待态 1.运行态: ...

最新文章

  1. React中如何优雅的捕捉事件错误
  2. 面试中经常出现的算法2(整理)
  3. 成为优秀程序员的方法就是抛开编程?
  4. Windows下一个比较完美的线程池实现
  5. 学python最重要的是_基础、语法都不是最重要的,学Python最重要的是什么?编程思路!-站长资讯中心...
  6. [BTS]使用BizTalk开发应用系统,就是这么简单!
  7. C++string详解
  8. 10个人里有几个大学生?
  9. 用css3制作一个搜索框效果
  10. [转]UIViewController内存管理
  11. 问题(二)--算法相关
  12. 布线问题—分支限界—java实现
  13. 超声波清洗机是什么?
  14. 一元三次方程求根公式及韦达定理
  15. Netty编解码,粘包拆包及零拷贝
  16. 【高等数学】无穷数级
  17. cmd命令查询电脑序列号_如何使用指令提示符查看电脑序列号
  18. 用示波器调出李萨如图形
  19. 极简工作法则- 泰普勒人生
  20. 全新2022强大的趣味心理测试小程序源码,趣味测试引流裂变神器,流量主激励广告实现管道收益

热门文章

  1. GraphicsMagick OpenMP 性能比较(icc+iomp vs gcc+gomp)
  2. 小学英语计算机问卷调查,小学英语学习情况问卷调查.docx
  3. 实验5 MapReduce初级编程实践(Python实现)
  4. 问题 P: C语言实验 - 一元二次方程 II
  5. python字典操作函数_【python】字典的操作方法和函数
  6. 怎样利用github搭建个人博客
  7. 200万奖金广聚天下算法英雄,第二届广州·琶洲算法大赛要来了!
  8. 大学生利用漏洞“骗走”京东110万, 中心化白条的漏洞, 区块链能否补得上?
  9. 数据结构C语言版:魔术师发牌问题
  10. 每日辣评:电动牙刷是个新风口?蒋凡是个幸运者?蔚来不降价?