Linux - 进程生命周期

时间:2024-03-21 20:34:49

本文参考了【深入Linux内核架构】

Linux操作系统属于多任务操作系统,系统中的每个进程能够分时复用CPU时间片,通过有效的进程调度策略实现多任务并行执行。而进程在被CPU调度运行,等待CPU资源分配以及等待外部事件时会属于不同的状态。下图描述了进程之间的状态关系:

 Linux - 进程生命周期

进程的三种基本状态:

运行:该进程此刻正在执行

等待:进程能够运行,但没有得到许可,因为CPU分配给另一个进程。调度器可以在下一次任务切换时选择该进程。

睡眠:该进程正在睡眠无法运行,因为它在等待一个外部事件。调度器无法在下一次任务切换时选择该进程。

 

一个进程在运行期间,不断地从一种状态转换到另一种状态,它可以多次处于就绪状态和执行状态,也可以多次处于阻塞状态。

 

(1) 就绪→执行

处于就绪状态的进程,当进程调度程序为之分配了处理机后,该进程便由就绪状态转变成执行状态。

 

(2) 执行→就绪

处于执行状态的进程在其执行过程中,因分配给它的一个时间片已用完或更高优先级的进程抢占而不得不让出处理机,于是进程从执行状态转变成就绪状态。

 

(3) 执行→阻塞

正在执行的进程因等待某种事件发生而无法继续执行时,便从执行状态变成阻塞状态。

 

(4) 阻塞→就绪

处于阻塞状态的进程,若其等待的事件已经发生,于是进程由阻塞状态转变为就绪状态。

 

(5) 运行→终止

 

程序执行完毕,撤销而终止

 

 

现在从理论回到实际,在Linux内核,涉及进程和程序的所有算法都围绕一个名为task_struct的数据结构建立。在其中,state指定了进程的当前状态,有下列值:

•       运行状态(TASK_RUNNING):意味着进程处于可运行状态。并不意味着已经实际分配了CPU。进程可能会一直等到调度器选中它。该状态确保进程可以立即运行,而无需等待外部事件。Linux 中使用TASK_RUNNING 宏表示此状态。

•       可中断睡眠状态(浅度睡眠)(TASK_INTERRUPTIBLE):针对等待某事件或其他资源的睡眠进程设置的。在内核发送信号给该进程表面事件已经发生时,进程状态变为TASK_RUNNING,它只要调度器选中该进程即可恢复执行。Linux 使用TASK_INTERRUPTIBLE 宏表示此状态。

•       不可中断睡眠状态(深度睡眠状态)(TASK_UNINTERRUPTIBLE):

其和浅度睡眠基本类似,因内核指示而停用的睡眠进程。不能由外部信号唤醒,只能由内核亲自唤醒。Linux 使用TASK_UNINTERRUPTIBLE 宏表示此状态。

•       暂停状态(TASK_STOPPED):进程暂停执行接受某种处理。如正在接受调试的进程处于这种状态,Linux 使用TASK_STOPPED 宏表示此状态。

•       僵死状态(TASK_ZOMBIE):进程已经结束但未释放PCB,Linux 使用TASK_ZOMBIE宏表示此状态

 Linux - 进程生命周期