Linux系统进程状态:

PROCESS STATE CODES

Here are the different values that the s, stat and state output specifiers (header "STAT" or "S") 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, either by a job control signal or because it is being traced.

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

X    dead (should never be seen)

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

Linux 进程有两种睡眠状态,一种interruptible sleep,处在这种睡眠状态的进程是可以通过给它发信号来唤醒的,比如发 HUP 信号给 nginx 的 master 进程可以让 nginx 重新加载配置文件而不需要重新启动 nginx 进程;另外一种睡眠状态是 uninterruptible sleep,处在这种状态的进程不接受外来的任何信号,无论是kill,kill -9,还是kill -15,因为他们完全不受到这些信号的支配,ps 手册里描述的D 状态就是 uninterruptible sleep,可以使用ps命令查看:

[build@kbuild-john ~]$ ps -a -ubuild -o pid,ppid,stat,command

PID  PPID STAT COMMAND
17009     1   Ds       -bash

17065     1   D         ls --color=tty -al

17577     1   D         /usr/java/jdk1.5.0_17/bin/java -Xmx512m -classpath /usr/local/a

17629     1   D         /usr/java/jdk1.5.0_17/bin/java -Xmx512m -classpath /usr/local/a

Unintelligible(D) VS intelligible(S)

运行:该进程此刻正在执行。

等待:进程能够运行,但没有得到许可,因为CPU分配给另一个进程。调度器可以在下一次任务切换时选择该进程。

睡眠:进程正在睡眠无法运行,因为它在等待一个外部事件。调度器无法在下一次任务切换时选择该进程。

Linux进程的睡眠状态有2种:

一种是可中断睡眠,其标志位是TASK_INTERRUPTIBLE ,可中断的睡眠状态的进程会睡眠直到某个条件变为真,比如说产生一个硬件中断、释放进程正在等待的系统资源或是传递一个信号都可以是唤醒进程的条件。比如你ctrl+c或者kill -9 ,能够立刻让进程响应这些信号(切换到TASK_RUNNING和再次进入就绪队列,执行注册的信号处理函数),不必要等待所需的资源满足后再响应这些信号。
一种睡眠是不可中断睡眠,其标志位是TASK_UNINTERRUPTIBLE ,把信号传递到这种睡眠状态的进程不能改变它的状态,也就是除非等待的资源得到满足,否则就是怎么kill,这个进程也不会变成TASK_RUNNING和进入就绪队列的。怎么都杀不死的。

TASK_UNINTERRUPTIBLE的意义

TASK_UNINTERRUPTIBLE存在的意义就在于,内核的某些处理流程是不能被打断的。如果响应异步信号,程序的执行流程中就会被插入一段用于处理异步信号的流程(这个插入的流程可能只存在于内核态,也可能延伸到用户态),于是原有的流程就被中断了。在对某些硬件进行操作时(比如进程调用read系统调用对某个设备文件进行读操作,而read系统调用最终执行到对应设备驱动的代码,并与对应的物理设备进行交互),可能需要TASK_UNINTERRUPTIBLE状态对进程进行保护,以避免进程与设备交互的过程被打断,造成设备陷入不可控的状态。

通常情况下TASK_UNINTERRUPTIBLE状态是非常短暂的,通过ps命令基本上不可能捕捉到。进程又是为什么会被置于 uninterruptible sleep 状态呢?处于 uninterruptible sleep 状态的进程通常是在等待 IO,比如磁盘 IO,网络 IO,其他外设 IO,如果进程正在等待的 IO 在较长的时间内都没有响应,很有可能有 IO 出了问题,可能是外设本身出了故障,也可能是比如挂载的远程文件系统NFS等已经不可访问了,那么就很会不幸地被 ps 看到进程状态位已经变成D。

正是因为得不到 IO 的相应,进程才进入了 uninterruptible sleep 状态,所以要想使进程从 uninterruptible sleep 状态恢复,就得使进程等待的 IO 恢复,比如如果是因为从远程挂载的 NFS 卷不可访问导致进程进入 D状态的,那么可以通过恢复该 NFS 卷的连接来使进程的 IO 请求得到满足,除此之外,要想干掉处在 D 状态进程就只能重启整个 Linux 系统了。如果为了想要杀掉 D 状态的进程,而去杀掉它的父进程(通常是shell,在shell下允许某进程,然后某进程转入D状态),就会出现这样的状态:他们的父进程被杀掉了,但是他们的父进程 PID 都变成了1,也就是 init 进程,D状态的进程会变成僵尸进程。

Unintelligible sleep几种场景:

1.NFS服务器发生故障或者关闭了,而客户端还没umount,此时运行某个如df的操作;

(此类问题可以考虑使用intr或者soft mount参数挂载)

2.如果问题出现在scsi或者类似的本地硬件驱动程序,很有可能是Bug。

3.其他类似的IO问题;

在vmstat命令中表示不可中断睡眠的简写不同于ps

Procs

r: The number of processes waiting for run time.

b: The number of processes in uninterruptible sleep.

转载于:https://blog.51cto.com/echo1937/1286437

Linux进程的Uninterruptible sleep(D)状态相关推荐

  1. Linux 进程的 Uninterruptible sleep(D) 状态

    首先,说一下产生D状态的原因. 上图阐释了一个进程运行的情况,首先,运行的时候,进程会向内核请求一些服务,内核就会将程序挂起进程,并将进程放到parked队列,通常这些进程只会在parked队列中停留 ...

  2. linux进程状态d状态,linux – 进程永久停留在D状态

    我有一个问题,在Ubuntu 10.04.3 LTS上陷入D状态的某些进程. 自11月5日(今天是12月6日)以来,他们一直处于这种状态.我知道这些是不间断的睡眠状态,通常与等待来自硬盘等硬件的数据有 ...

  3. Linux进程睡眠状态disk sleep

    Linux进程睡眠状态disk sleep <Linux-进程管理> 1. Linux进程状态 Running(R):运行或将要运行 Interruptible(S):被阻断而等待一个事件 ...

  4. Linux进程所处状态主要包括,linux进程状态

    为了管理进程,内核必须对每个进程所做的事情进行清楚的描述,内核使用PCB(Proccess Control Block)来记录这样的信息.在linux系统中,它就是一个 struct task_str ...

  5. Linux正在更新缓存卡住,Linux 进程卡住了怎么办?

    在我们使用 Linux 系统时,如果网络或者磁盘等 I/O 出问题,会发现进程卡住了,即使用kill -9也无法杀掉进程,很多常用的调试工具,比如strace,pstack等也都失灵了,是怎么回事? ...

  6. Linux 进程卡住了怎么办?

    在我们使用 Linux 系统时,如果网络或者磁盘等 I/O 出问题,会发现进程卡住了,即使用 kill -9 也无法杀掉进程,很多常用的调试工具,比如 strace, pstack 等也都失灵了,是怎 ...

  7. linux进程为什么sleep,求高手,linux系统几乎所有进程处于sleep状态是否正常

    满意答案 你的sleep进程基本上都是java相关的.可能是由于某个进程长期得不到响应,比如nfs造成的IO中断,应用一直在等待响应,等的都睡着了..所以也看不到报错,呵呵.具体的也看不出到底是哪个进 ...

  8. linux 进程几种状态,linux进程状态

    linux系统最常用的命令莫过于ps,经常要用其查看linux的进程和线程情况.此文我们着重来看进程 .进程又分为以下几种状态: 1. 运行(正在运行或在运行队列中等待) 2. 中断(休眠中, 受阻, ...

  9. 【Linux进程、线程、任务调度】一 Linux进程生命周期 僵尸进程的含义 停止状态与作业控制 内存泄漏的真实含义 task_struct以及task_struct之间的关系

    学习交流加(可免费帮忙下载CSDN资源): 个人微信: liu1126137994 学习交流资源分享qq群1(已满): 962535112 学习交流资源分享qq群2: 780902027 文章目录 1 ...

最新文章

  1. HBase scan 时 异常 ScannerTimeoutException 解决
  2. nginx简单代理配置
  3. 修改mysql表的存储引擎
  4. java 生产者消费者代码_Java生产者和消费者代码
  5. php字节怎么转化成字符串,php将utf-8(3字节)字符串转换成字节
  6. ZooKeeper JMX
  7. sort()与cmp()
  8. 太原理工大学ICPC队介绍(2020版)
  9. android底部显示不出来,Android studio 底部的状态栏不见了如何显示
  10. 硅谷钢铁侠的的传奇人生
  11. 在VMware16虚拟机安装Ubuntu详细教程
  12. python-docx原有图片居中
  13. Python:摄氏温度转华氏温度
  14. 【VSCode教程】 C++第一个DLL、远离手动GCC、快速自动生成、来 say_helloヽ(^o^)丿
  15. Not authorized , ReasonPhrase:Unauthorized
  16. Java虚拟机周志明Eason-zhang解读
  17. DAP数据分析平台可视化组件开发
  18. 机器学习10大经典算法详解
  19. 火了,新东方年会吐槽视频《释放自我》:累死累活干不过写PPT的
  20. 一个典型的微型计算机绘图系统,机械制图考试理论知识练习题

热门文章

  1. mapx实现热点效果
  2. 张家界a货翡翠,酒泉a货翡翠
  3. select的value值为对象时,获取label和value
  4. 【进阶4-1期】详细解析赋值、浅拷贝和深拷贝的区别
  5. 买粮油也能玩出新花样?京东超市携手金龙鱼带来狗年礼盒!
  6. XSS的原理分析与解剖
  7. CrazyWing:Python自动化运维开发实战 八、Python数据类型之字符串
  8. SVN的Windows和Linux客户端操作详解
  9. 2015年度互联网安全报告发布 移动支付成重灾区
  10. Freemarker和Spring开发:获取相对路劲和绝对路径的最优方式