操作系统中有许多同时执行的进程,这些进程都可能处于不同的状态代表着不同的含义。
R运行状态(running)
概念:并不意味着进程一定在运行中,它表明进程要么是在运行中要么在运行队列里。
我们运行可执行程序myproc利用指令 ps ajx可以看到进程myproc的状态是R状态。
S睡眠状态(sleeping)
概念:意味着进程在等待事件完成(这里的睡眠有时候也叫做可中断睡眠)。
当mycode.c中的代码是如下时,再查看进程myproc的状态就是S睡眠状态了。
为什么进程的状态由R变为了S,尽管它是正在运行的。其实我们由睡眠状态的概念可知,进程等待某个事件的完成,这段时间进程就处于睡眠状态,由于myproc进程需要向终端输入字符串数据,因此每次终端打印字符串时,进程myproc都要等待字符串成功输进终端,这里要强调一点是:进程在CPU中运行此时进程才是R态,由于CPU对进程的处理速度所用时间非常快,远快于进程等待字符串成功输进终端的时间。因此进程在运行的大部分时间里都是处于等待字符串成功输进终端,所以我们此时看到的myproc进程的状态是S态。
D磁盘休眠状态(Disk sleep)
概念:有时候也叫不可中断睡眠状态(uninterruptible sleep),在这个状态的进程通常会等待IO的结束。
T停止状态(stopped)
概念:可以通过发送 SIGSTOP 信号给进程来停止(T)进程。这个被暂停的进程可以通过发送 SIGCONT 信号让进程继续运行。
我们先来认识一下如何停止正在运行的进程并且重新让它运行的指令:
停止进程:kill -19 PID
恢复运行进程:kill -18 PID
执行程序myproc:
X死亡状态(dead)
概念:这个状态只是一个返回状态,你不会在任务列表里看到这个状态。
僵尸进程
僵尸状态(Zombies)是一个比较特殊的状态。当进程退出并且父进程没有读取到子进程退出的返回代码时就会产生僵死(尸)进程。僵死进程会以终止状态保持在进程表中,并且会一直在等待父进程读取退出状态代码。所以,只要子进程退出,父进程还在运行,但父进程没有读取子进程状态,子进程进入Z状态。
我们可以通过下面代码来对该状态进行试验:
僵尸进程的危害:
孤儿进程
父进程如果提前退出,那么子进程后退出,进入Z之后,那该如何处理呢? 父进程先退出,子进程就称之为“孤儿进程”。孤儿进程被PID为1的操作系统进程领养,当然要由操作系统进程释放。