以下部分的代码示例,来自于Linux内核的0.11版本源码
在定义进程的数据结构task_struct时,有一个state字段是用来表示进程状态的,这里总结了下关于state字段的操作
关于进程的几个状态值在sched.h中定义如下
#define
TASK_RUNNING 0
#define
TASK_INTERRUPTIBLE 1
#define
TASK_UNINTERRUPTIBLE 2
#define
TASK_ZOMBIE 3
#define
TASK_STOPPED 4
在Linus对state的注释中,是这样写的,state<0为不可运行状态(可能是初始化时的值,后面将讨论)、state=0为运行状态(就绪也属于此状态)、state>0为进程停止运行状态(不论是进程正处于睡眠或是已经退出终止了)
下面讨论对state的字段修改是在哪些地方
[进程初始化时的state字段修改]
首先当一个进程被创建的时候,它的状态是
TASK_UNINTERRUPTIBLE;因为这时它的数据都是从父进程赋值而来的,还没有设置成自己进程的数据。
*p = *current;
/* NOTE! this doesn't copy the supervisor stack */
p->state = TASK_UNINTERRUPTIBLE;
当进程数据设置完成后,进程变为可运行状态
p->state = TASK_RUNNING;
/* do this last, just in case */
以上者两部分代码都是来自fork.c的copy_process函数。在最后设置好了新建进程的state字段后,copy_process函数返回。
[进程退出时的状态设置]
当进程退出的时候,state字段被设置为
TASK_ZOMBIE,在exit.c的do_exit函数中,对当前退出的进程,将其状态设置成
TASK_ZOMBIE.
current->state = TASK_ZOMBIE;
current->exit_code = code;
tell_father(current->father);
schedule();
<