目的

为了对进程从产生到消亡的整个过程进行跟踪和描述,就需要定义各种进程的各种状态并制定相应的状态转换策略,以此来控制进程的运行。

粗略分类

  1. 运行态:进程占用 CPU,并在 CPU 上运行;
  2. 就绪态:进程已经具备运行条件,但是 CPU 还没有分配过来;
  3. 阻塞态:进程因等待某件事发生而暂时不能运行;

当然理论上上述三种状态之间转换分为六种情况;

  1. 运行 → 就绪:这是有调度引起的,主要是进程占用 CPU 的时间已耗尽。
  2. 就绪 → 运行:当前运行的进程的时间片用完,调度就从就绪队列中选择合适的进程分配给 CPU。
  3. 运行 → 阻塞:发生了 I/O 请求或等待某件事的发生。
  4. 阻塞 → 就绪:进程所等待的事件发生,就进入就绪队列。

以上4种情况可以相互正常转换,不是还有两种情况吗?

  1. 阻塞 → 运行:即使给阻塞进程分配 CPU,也无法执行,操作系统进行调度时不会从阻塞队列进行挑选,其调度的选择对象为就绪队列。
  2. 就绪 → 阻塞:因为就绪态根本就没有执行,何来进入阻塞态?

详细分类

现在知道了进程的三种基本状态,但是在操作系统具体现实中,设计者可以根据实际情况设置不同的状态,这样以来就出现了以下几种状态:

  1. 可运行态:运行态和就绪态的合并,表示进程正在运行或准备运行,Linux 中使用 TASK_RUNNING 宏表示此状态。
  2. 浅度睡眠态:进程正在睡眠(被阻塞),等待资源到来是唤醒,也可以通过其他进程信号或时钟中断唤醒,进入运行队列。Linux 使用 TASK_INTERRUPTIBLE 宏表示此状态。
  3. 深度睡眠态:其和浅度睡眠基本类似,但有一点就是不可其他进程信号或时钟中断唤醒。Linux 使用 TASK_UNINTERRUPTIBLE 宏表示此状态。
  4. 暂停状态:进程暂停执行接受某种处理。如正在接受调试的进程处于这种状态,Linux 使用 TASK_STOPPED 宏表示此状态。
  5. 僵死状态:进程已经结束但未释放 PCB,Linux 使用 TASK_ZOMBIE 宏表示此状态。

我们可以来看下以上宏在内核中的定义:

#define TASK_RUNNING            0
#define TASK_INTERRUPTIBLE      1
#define TASK_UNINTERRUPTIBLE    2
#define __TASK_STOPPED          4
#define __TASK_TRACED           8
/* in tsk->exit_state */进程的退出状态
#define EXIT_ZOMBIE             16
#define EXIT_DEAD               32
/* in tsk->state again */我理解为进程的唤醒状态
#define TASK_DEAD               64
#define TASK_WAKEKILL           128
#define TASK_WAKING             256
#define TASK_STATE_MAX          512
#define TASK_STATE_TO_CHAR_STR "RSDTtZXxKW"

LINUX进程间状态转换和内核调用图

(SAW:Game Over!)

Linux 进程状态详解相关推荐

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

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

  2. linux进程状态详解

    Linux是一个多用户,多任务的系统,可以同时运行多个用户的多个程序,就必然会产生很多的进程,而每个进程会有不同的状态. Linux进程状态:R (TASK_RUNNING),可执行状态 只有在该状态 ...

  3. linux 进程 status,Linux 进程状态详解

    目的 为了对进程从产生到消亡的整个过程进行跟踪和描述,就需要定义各种进程的各种状态并制定相应的状态转换策略,以此来控制进程的运行. 粗略分类运行态:进程占用CPU,并在CPU上运行: 就绪态:进程已经 ...

  4. linux系统进程有哪几种主要状态,Linux 进程状态详解

    目的 为了对进程从产生到消亡的整个过程进行跟踪和描述,就需要定义各种进程的各种状态并制定相应的状态转换策略,以此来控制进程的运行. 粗略分类 运行态:进程占用CPU,并在CPU上运行: 就绪态:进程已 ...

  5. Linux进程详解 【Linux由基础到进阶】

    Linux进程详解 进程的概念: 虚拟处理器: 虚拟内存: 进程的产生 进程的管理 进程描述符 分配进程描述符 进程描述符的存放 进程的状态 设置进程状态 进程上下文 系统调用与库函数的区别 进程家族 ...

  6. Linux 目录详解 树状目录结构图

    1.树状目录结构图 2./目录 目录 描述 / 第一层次结构的根.整个文件系统层次结构的根目录. /bin/ 需要在单用户模式可用的必要命令(可执行文件):面向所有用户,例如:cat.ls.cp,和/ ...

  7. Linux进程详解(二)完结

    原创架构师之路2019-08-13 22:08 接Linux进程详解(一) 4. 进程运行 程序运行时大部分进程状态为运行或睡眠.调度算法解决可以跑的运行状态(就绪和运行),剩下的不可以跑的进程就是睡 ...

  8. [转载] Linux 内核进程详解之二: bdi-default

    原文链接: Linux 内核进程详解之二: bdi-default 转载说明 (最后更新于: 2019-04-03, 12:26:50) 转载本文的原意仅是为了理解 "bdi" 所 ...

  9. Linux proc详解

    本文转自:http://hi.baidu.com/beyond907/blog/item/250f41249c9fbb7435a80fd2.html Linux procfs详解 1.0 proc文件 ...

最新文章

  1. Rclone使用笔记
  2. labview生成exe
  3. sklearn pipeline_我的sklearn学习经验
  4. 使用iozone和bonnie测试磁盘IO
  5. 3_python基础—运算符 2
  6. 创建用于图像大小调整和裁剪器保持纵横比的ASP.NET控件
  7. markdown引入代码_将Swagger2文档导出为HTML或markdown等格式离线阅读
  8. 把苦难装在心里--《赢在中国》(2008-05-27)
  9. 歌谷服务套件gms_谷歌gms框架安装器下载-安卓9谷歌服务框架app安装-游戏大玩家...
  10. yaml格式文件介绍
  11. 虚拟机安装(保姆级教程)
  12. ubuntu 下应用 Python 和 SL4A 的 Android 应用程序搭建您自己的android研发环境
  13. 嵌入式编程中的堆栈溢出检测
  14. C# 语言和 .NET Framework 介绍
  15. 【MySQL基础】什么是MySQL约束?什么是主键约束?
  16. 【李刚-21天通关Python】第一章:Python入门与字符串
  17. CSS中background-attachment的介绍和用法
  18. 「RPC」简述RPC
  19. 红米10android auto,红米3 安卓10 原生体验 LineageOS17.1 ROOT
  20. Oracle存储过程入门教程(通俗理解存储过程)

热门文章

  1. PHP中如何给日期加上一个月 加一周 加一天
  2. mysql表引擎修改
  3. maven实战笔记-12
  4. 组合逻辑与lamda算子的历史 英文
  5. sql注入***原理
  6. 将SQL Server中所有表的列信息显示出来
  7. 让193FW显示1440x900还真不容易
  8. Echarts中Option属性设置
  9. hdfs yarn hbase pid文件被删除解决办法:修改hadoop-daemon.sh yarn-daemon.sh hbase-daemon.sh中PID_DIR存储路径
  10. python3数据类型:String字符串