进程的状态

在Linux操作系统中,每个进程在不同时刻都可能会有不同的状态。这些进程可能的状态共有6个,分别是:可运行状态、可中断的睡眠状态、不可中断的睡眠状态、暂停状态或跟踪状态、僵尸状态和退出状态。下面我们分别对这几种状态进行简要的说明。

  • 可运行状态(TASK_RUNNING,简称为R):如果一个进程处在该状态,那么说明它将要、立刻或正在CPU上运行。运行的时机是不确定的。这会由进程调度器来决定。

  • 可中断的睡眠状态(TASK_INTERRUPTIBLE,简称为S):当进程正在等待某个事件(比如网络连接或信号灯)的发生时会进入此状态。这样的进程会被放入对应事件的等待队列中。当事件发生时,对应的等待队列中的一个或多个进程就会被唤醒。

  • 不可中断的睡眠状态(TASK_UNINTERRUPTIBLE,简称为D):此种状态与可中断的睡眠状态的唯一区别就是它是不可被打断的。这意味着处在此种状态的进程不会对任何信号作出响应。更确切地讲,发送给处于不可中断状态的进程的信号直到该进程从此状态转出才会被传递过去。进程处于此种状态通常是由于在等待一个特殊的事件。比如在等待同步的I/O操作(磁盘I/O等)的完成。I/O是Input/Output的缩写,在这里可以理解为对输入输出信息的处理。

  • 暂停状态或跟踪状态(TASK_STOPPED或TASK_TRACED,简称为T):向进程发送SIGSTOP信号就会使该进程转入暂停状态,除非该进程正处于不可中断的睡眠状态。向正处于暂停状态的进程发送SIGCONT信号会使该进程转向可运行状态。处于被跟踪状态的进程会暂停并等待跟踪它的进程对它进行操作。例如,我们使用调试工具GDB在某个程序中设置一个断点,而后对应的进程在运行过程中会在断点处停下来并等待被操作。这时,此进程就处于跟踪状态。跟踪状态与暂停状态非常类似。但是,向处于跟踪状态的进程发送SIGCONT信号并不能使它被恢复。只有当调试进程进行了相应的系统调用或者退出之后,它才能够被恢复。

  • 僵尸状态(TASK_DEAD-EXIT_ZOMBIE,简称为Z):处于此状态的进程即将要结束。该进程占用的绝大多数资源也都已经被回收。不过还有一些信息未被删除,比如退出码以及一些统计信息。保留这些信息是考虑到该进程的父进程可能需要它们。由于此时的进程主体已经被删除而只留下了一个空壳,故此状态常被称为僵尸状态。

  • 退出状态(TASK_DEAD-EXIT_DEAD,简称为X):在进程退出的过程中,有可能连退出码和统计信息都不需要被保留。造成这种情况的原因可能是显式地让该进程的父进程忽略掉SIGCHLD信号(当一个进程消亡的时候,内核会给其父进程发送一个SIGCHLD信号以告知此情况),也可能是该进程已经被分离。分离的含义是让子进程和父进程分别独立运行。分离后的子程序将不会再使用和执行与父进程共享的代码段中的指令,而是加载并运行一个全新的程序(我们讲“进程的衍生”的时候提到过)。在这些情况下,该进程在退出的时候就不会转入僵尸状态,而会直接转入退出状态。处于退出状态的进程会立即被干净利落地结束掉。它所占用的系统资源也会被操作系统自动回收。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值