进程状态描述:

一个进程的诞生,是从其父进程调用fork()开始的。

进程从刚开始被创建出来,是处于TASK_RUNNING(就绪态),进程被放在等待队列中排队等待系统调度。

linux内核中的函数sched()称为调度器,它会根据各种参数来选择一个等待的进程去占用cpu,当进程占用了cpu后,就从就绪态转变成了执行态。此时进程可以运行了,但是运行时间有一个限制,即“时间片”的概念。当时间片耗光的情况下该进程还没有结束的话,那么会被系统重新放入等待队列中等待。 要注意的是:处于"执行态"的进程即使时间片没有耗光,也可能被别的更高优先级的进程抢占cpu,被迫重新回到等待队列中等待。

进程处于"执行态"时,可能会因为某些资源的不可得而被置为 "睡眠态 / 挂起态",如进程要读取一个管道文件数据,而管道为空。或者使用 sleep() 强制自己挂起。这些情况下进程都会变成 TASK_UNINTERRUPIBLE(睡眠态)或 TASK_INTERRUPIBLE(挂起态)在睡眠期间不能响应信号,挂机期间可以响应信号。 当进程中所等待的资源变得可获取时,又会被系统置为TASK_RUNNING(就绪态)重新排队。

当进程收到SIGSTOP 或 SIGTSTP 中的一个信号时,状态就会置为 TASK_STOPPED(暂停态)。该状态下进程不再参与调度,系统资源也不释放。直到收到 SIGCONT信号后被重新置为就绪态

进程运行结束以后就会被置为 EXIT_ZOMBIE(僵尸态),这里僵尸指的是进程的PCB(进程控制块)。进程结束以后会留下一些信息封存进该进程的PCB里面,好让它的父进程知道进程是怎么结束的。

父进程调用 wait() / waitpid() 来查看子进程的结束信息,顺便做一件非常重要的事情:将子进程的状态设置为 EXIT_DEAD(死亡态)。因为处于这个状态下的进程的PCB才能系统回收。

 

下面是进程状态运行图:

 

Logo

更多推荐