当iowait升高时,进程很可能因为得不到硬件的响应,而长时间处于不可中断状态.从ps或者top命令的输出中,可以发现它们都处于D状态,也就是不可中断状态

1. 进程状态

top命令输出的S列(status)表示进程状态:

  • R 是(Running或Runnable)的缩写,表示进程在CPU的就绪队列中,正在运行或者等待运行
  • D 是(Disk Sleep)的缩写,也就是不可中断状态睡眠(Uninterruptible Sleep),一般表示进程正在跟硬件交互,并且交互过程不允许被其他进程或中断打断。
  • Z 是(Zombie)的缩写,它表示僵尸进程,也就是进程实际上已经结束了,但是父进程还没有回收它的资源
  • S 是(Interruptible Sleep)的缩写,也就是可中断状态睡眠。表示进程因为等待某个事件 而被系统挂起。当进程等待的事件发生时,它会被唤醒并进入R状态。
  • I 是 Idle 的缩写,也就是空闲状态,用在不可中断睡眠的内核线程上
  • T 或者 t,也就是Stopped或Traced的缩写,表示进程处于暂停或者跟踪状态。
  • X,也就是 Dead 的缩写,表示进程已经消亡。所以你不会在top或者ps命令中看到它。

2.不可中断进程和僵尸进程

  • 不可中断进程:如果系统或硬件发生了故障,进程可能会在不可中断状态保持很久,甚至导致系统中出 现大量不可中断进程
  • 僵尸进程:正常情况下,当一个进程创建了子进程后,它应该通过系统调用wait()或者waitpid()等待子进程结束,回收子进程的资源;而子进程在结束时,会向它的父进程发送 IGCHLD信号,所以,父进程还可以注册SIGCHLD信号的处理函数,异步回收资源。父进程没这么做,或是子进程执行太快,父进程还没来得及处理子进程状态,子进程就已经提前退出,那这时的子进程就会变成僵尸进程。

3.小结

不可中断状态,表示进程正在跟硬件交互,为了保护进程数据和硬件的一致性,系统不 允许其他进程或中断打断这个进程。进程长时间处于不可中断状态,通常表示系统有 I/O 性能问题。

僵尸进程表示进程已经退出,但它的父进程还没有回收子进程占用的资源。短暂的僵尸 状态我们通常不必理会,但进程长时间处于僵尸状态,就应该注意了,可能有应用程序 没有正常处理子进程的退出。