linux上进程有5种状态:
1. 运行(正在运行或在运行队列中等待)
2. 中断(休眠中, 受阻, 在等待某个条件的形成或接受到信号)
3. 不可中断(收到信号不唤醒和不可运行, 进程必须等待直到有中断发生)
4. 僵死(进程已终止, 但进程描述符存在, 直到父进程调用wait4()系统调用后释放)
5. 停止(进程收到SIGSTOP, SIGSTP, SIGTIN, SIGTOU信号后停止运行运行)

ps工具标识进程的5种状态码:
D 不可中断 uninterruptible sleep (usually IO)
R 运行 runnable (on run queue)
S 中断 sleeping
T 停止 traced or stopped
Z 僵死 a defunct ("zombie") process

R : 可执行状态

只有在该状态的进程才可能在CPU上运行。而同一时刻可能有多个进程处于可执行状态,这些进程的task_struct结构(进程控制块)被放入对应CPU的可执行队列中(一个进程最多只能出现在一个CPU的可执行队列中)。进程调度器的任务就是从各个CPU的可执行队列中分别选择一个进程在该CPU上运行。

很多操作系统教科书将正在CPU上执行的进程定义为RUNNING状态、而将可执行但是尚未被调度执行的进程定义为READY状态,这两种状态在linux下统一为 TASK_RUNNING状态。

S:可中断的睡眠状态

处于这个状态的进程因为等待某某事件的发生(比如等待socket连接、等待信号量),而被挂起。这些进程的task_struct结构被放入对应事件的等待队列中。当这些事件发生时(由外部中断触发、或由其他进程触发),对应的等待队列中的一个或多个进程将被唤醒。

通过ps命令我们会看到,一般情况下,进程列表中的绝大多数进程都处于task_interruptible状态(除非机器的负载很高)。毕竟CPU就这么一两个,进程动辄几十上百个,如果不是绝大多数进程都在睡眠,CPU又怎么响应得过来。

 D: 不可中断的睡眠状态

与task_interruptible状态类似,进程处于睡眠状态,但是此刻进程是不可中断的。不可中断,指的并不是CPU不响应外部硬件的中断,而是指进程不响应异步信号。 绝大多数情况下,进程处在睡眠状态时,总是应该能够响应异步信号的。但是uninterruptible sleep 状态的进程不接受外来的任何信号,因此无法用kill杀掉这些处于D状态的进程,无论是”kill”, “kill -9″还是”kill -15″,这种情况下,一个可选的方法就是reboot。

处于uninterruptible sleep状态的进程通常是在等待IO,比如磁盘IO,网络IO,其他外设IO,如果进程正在等待的IO在较长的时间内都没有响应,那么就被ps看到了,同时也就意味着很有可能有IO出了问题,可能是外设本身出了故障,也可能是比如挂载的远程文件系统已经不可访问了.

Z :退出状态,进程成为僵尸进程

在Linux进程的状态中,僵尸进程是非常特殊的一种,它是已经结束了的进程,但是没有从进程表中删除。太多了会导致进程表里面条目满了,进而导致系统崩溃,倒是不占用其他系统资源。

它已经放弃了几乎所有内存空间,没有任何可执行代码,也不能被调度,仅仅在进程列表中保留一个位置,记载该进程的退出状态等信息供其他进程收集,除此之外,僵尸进程不再占有任何内存空间。

进程在退出的过程中,处于TASK_DEAD状态。在这个退出过程中,进程占有的所有资源将被回收,除了task_struct结构(以及少数资源)以外。于是进程就只剩下task_struct这么个空壳,故称为僵尸

最新文章

  1. Exception:HTTP Status 500 - org.apache.ibatis.binding.BindingException: Invalid bound statement (not found)
  2. 【转】2016/2017 Web 开发者路线图
  3. centos 安装jdk
  4. B/S 和 C/S
  5. BZOJ2253: [2010 Beijing wc]纸箱堆叠
  6. Java 8 Stream API Example Tutorial
  7. fastjson的坑 com.alibaba.fastjson.JSONObject cannot be cast to xxx
  8. 模拟教室网络(跨VLAN,跨网段通讯)
  9. python实现单例模式
  10. C++学习-6
  11. 我的第一个RootKit,支持XP、Vista、Win7、Win8 RTM 32位
  12. Mybatis与Ibatis比较
  13. java编程(2)——servlet和Ajax异步请求的接口编程(有调用数据库的数据)
  14. Java关键字(三)——static
  15. SpringSecurity认证处理流程
  16. Java8的lambda表达式和Stream API
  17. 2018-01-03 烂尾工程: Java实现的汇编语言编译器
  18. 深入理解HTTP协议及原理分析
  19. 2019.01.08 bzoj3809: Gty的二逼妹子序列(莫队+权值分块)
  20. Ajax学习(一)

热门文章

  1. JavaScript学习总结(十二)——JavaScript编写类
  2. 前端:jQuery笔记
  3. (C/C++学习笔记) 十三. 引用
  4. mybatis左连接需要输出左表的指定内容与筛选
  5. kbmMW CopyRawRecords 用法
  6. VM VirtualBox虚拟机与物理主机之间的复制
  7. springboot跨域请求
  8. FreeOpcUa compile
  9. MyEclipse 2014 破解图文详细教程
  10. MyEclipse2014配置Tomcat开发JavaWeb程序JSP以及Servlet