linux进程状态

linux系统最常用的命令莫过于ps,经常要用其查看linux的进程和线程情况。此文我们着重来看进程 。进程又分为以下几种状态:



1. 运行(正在运行或在运行队列中等待) <br />

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

其对应在ps上的相应状态码如下:



<table border="1" cellspacing="1" cellpadding="1" width="500">
    <tbody>
        <tr>
            <td style="text-align:center;">
                状态
            </td>
            <td style="text-align:center;">
                定义
            </td>
        </tr>
        <tr>
            <td style="text-align:center;">
                R
            </td>
            <td>
                Running.运行中
            </td>
        </tr>
        <tr>
            <td style="text-align:center;">
                S
            </td>
            <td>
                Interruptible Sleep.等待调用
            </td>
        </tr>
        <tr>
            <td style="text-align:center;">
                D
            </td>
            <td>
                Uninterruptible Sleep.等待磁盘IO
            </td>
        </tr>
        <tr>
            <td style="text-align:center;">
                T
            </td>
            <td>
                Stoped.暂停或者跟踪状态
            </td>
        </tr>
        <tr>
            <td style="text-align:center;">
                X
            </td>
            <td>
                Dead.即将被撤销
            </td>
        </tr>
        <tr>
            <td style="text-align:center;">
                Z
            </td>
            <td>
                Zombie.进程已经结束,仅映像名留存
            </td>
        </tr>
        <tr>
            <td style="text-align:center;">
                W
            </td>
            <td>
                Paging.内存交换
            </td>
        </tr>
        <tr>
            <td style="text-align:center;">
                N
            </td>
            <td>
                优先级低的进程
            </td>
        </tr>
        <tr>
            <td style="text-align:center;">
                <
            </td>
            <td>
                优先级高的进程
            </td>
        </tr>
        <tr>
            <td style="text-align:center;">
                s
            </td>
            <td>
                进程的领导者
            </td>
        </tr>
        <tr>
            <td style="text-align:center;">
                L
            </td>
            <td>
                锁定状态
            </td>
        </tr>
        <tr>
            <td style="text-align:center;">
                l
            </td>
            <td>
                多线程状态
            </td>
        </tr>
        <tr>
            <td style="text-align:center;">
                +
            </td>
            <td>
                前台进程
            </td>
        </tr>
    </tbody>
</table>



平时在查看linux进程状态时,查看最多的三个状态是R&nbsp; S&nbsp;&nbsp; D&nbsp;



R状态,不必多说,R就是running的缩写,即运行中的进程。



S 即 sleep进程,休眠进程。其又分为两种:
  1. Interruptible Sleep(可中断睡眠,在ps命令中显示“S”)。处在这种睡眠状态的进程是可以通过给它发送signal来唤醒的,比如发HUP信号给nginx的master进程可以让nginx重新加载配置文件而不需要重新启动nginx进程;
  2. Uninterruptible Sleep(不可中断睡眠,在ps命令中显示“D”)。处在这种状态的进程不接受外来的任何signal,这也是为什么之前我无法用kill杀掉这些处于D状态的进程,无论是“kill”, “kill -9”还是“kill -15”,因为它们压根儿就不受这些信号的支配。
D 即上面提到的Uninterruptible Sleep ,如果从广义上来分,D状态算是一种特殊的S状态进程。进程为什么会被置于D状态呢?

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

 
正是因为得不到IO的响应,进程才进入了uninterruptible sleep状态,所以要想使进程从uninterruptible sleep状态恢复,就得使进程等待的IO恢复,比如如果是因为从远程挂载的NFS卷不可访问导致进程进入uninterruptible sleep状态的,那么可以通过恢复该NFS卷的连接来使进程的IO请求得到满足,除此之外,要想干掉处在D状态进程就只能重启整个Linux系统(D进程并不能通过kill 和kill -9 杀掉) 。
&nbsp;

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注