操作系统为了对进程进行管理,就必须对每个进程在其生命周期内涉及的所有事情进行全面的描述,而所有这些信息在内核中可以用一个结构体来描述———linux中把对进程的描述结构叫做task_struct。传统上,这样的数据结构叫做进程控制块PCB。Linux中PCB是一个庞大的结构体。(具体包含什么可上网自行查询)
在进程的整个生命周期中,系统(也就是内核)总是同过PCB对进程进行控制的,也就是说,系统是根据PCB感知进程的存在的。
PCB是进程存在的唯一标志,当系统创建一个进程时,就为他建立了一个PCB,进程结束时又收回器PCB,进程也随之消亡。
1.进程状态
(1) 就绪态(TASK_RUNNING):正在运行或准备运行,处于这个状态的所有进程组成就绪队列。
(2)睡眠(或等待)态:分为浅度睡眠和深度睡眠。
浅度睡眠态(TASK_INTERRUPTIBLE):进程正在睡眠(被阻塞),等待资源有效时被唤醒,且可以由其他进程通过信号或时钟中断唤醒。
深度睡眠态(TASK_UNTERRUPTIBLE):与前一个状态类似,但其他进程法来的信号和中断并不能打断他的熟睡。
(3)暂停状态(TASK_STOPPED):进程暂停执行,比如,当接收如下信号时进入暂停状态。
SIGSTOP——停止进程执行。
SIGTSTP——从终端发来信号停止进程。
SIGTTIN——来自键盘的中断。
SIGTTOU——后台进程请求输出。
(4)僵死状态(TASK_ZOMBIE):进程执行结束但尚未消亡的一种状态。此时,进程已经结束且释放大部分资源,但尚未释放其PCB。
当一个进程调用了exit之后,该进程并非马上就消失,而是变为僵死进程。它已经放弃了几乎所有内存空间,没有任何可执行代码,也不能被调度,但它的PCB还没有被释放。进程PCB的完全释放是在wait调用之后,若父进程还没有调用wait,则该进程处于僵死状态。(在前几篇博客中有一篇转发的关于僵死进程和孤儿进程的文章)
在task_struct结构体中,状态域定义为:
struct task_struct {
volatile long state; //-1 unrunnable, 0 runnable, >0 stopped
.....
};