內核程式透过行程表对行程进行程管理,每个行程在行程表中佔有一项。在Linux系统中,行程表项是一个task_struct任务结构指标。任务资料结构定义在标头档include/linux/sched.h中。有写书上称其为行程控制块PCB(Process Control Block)或行程描述符PD (Processor Descriptor) 。其中保存著用于控制和管理行程的所有信息。主要包括当前执行的状态信息、信号、行程号、父行程号、执行时间累计值、正在使用的档案和本任务的区域描述符以及任务状态段信息。该结构每个栏位的具体含义如下所示。
};
■ long state栏位含有行程的当前状态代号。如果行程正在等待使用CPU或者行程正被执行,那麼state的值是TASK_RUNNING。如果行程正在等待某一事件的发生因而处於空閒状态,那麼state的值就是TASK_INTERRUPTIBLE或者TASK_UNINTERRUPTIBLE。这两个值含义区別在于处于TASK_INTERRUPTIBLE状态的行程能夠被信号喚醒並啟动,而处於TASK_UNINTERRUPTIBLE状态的行程则通常是在直接或间接地等待硬件条件的满足因而不会接受任何信号。TASK_STOPPED状态用於說明一个行程正处於停止状态。例如行程在收到一个相关信号时(例如SIGSTOP、SIGTTIN或SIGTTOU等)或者当行程被另一个行程使用ptrace系统呼叫监控並且控制权在监控行程中时。TASK_ZOMBIE状态用於描述一个行程已经被终止,但其任务资料结构项仍然存在於任务结构表中。一个行程在这些状态之间的转換过程见下面說明。
■ long counter栏位保存著行程在被暂时停止本次执行之前还能执行的时间滴答数,即在正常情況下还需要经过几个系统时钟周期才切換到另一个行程。调度程式会使用行程的counter值来选择下一个要执行的行程,因此counter可以看作是一个行程的动态特性。在一个行程刚被建立时counter的初值等於priority。
■ long priority用於给counter代入初始值。在Linux0.12中这个初值为15个系统时钟週期时间(15个滴答)。当需要时调度程式会使用priority的值为counter代入一个初值,参见sched.c程式和fork.c程式。当然,priority的单位也是时间滴答数。
■ long signal栏位是行程当前所收到信号的点阵图,共32个Bit位,每个Bit位元代表一种信号,信号值二位元偏移值 +l。因此Linux內核最多有32个信号。在每个系统呼叫处理过程的最后,系统会使用该信号点阵图对信号进行预处理。