在linux中每一个进程都有 tast_struct数据结构来定义。test_struct就是我们通常所说的PCB。他是对进程控制的唯一手段也是最有效的手段。当我们调用fork()时,系统会为我们产生一个tast_struct结构。然后从父进程那里继承一些数据,并把新的进程插入到进程树中以待进行进程管理。因此了解task_struct的结构对于我们理解进程调度的关键。
在进行剖析task_struct的定义之前,我们先按照理论推一下他的结构:
1、进程状态,将记录进程在等待,运行,或死锁
2、调度信息,由哪个调度函数调度,怎样调度等
3、进程的通讯状况
4、因为要插入进程树,必须有联系父子兄弟的指针,当然是task_struct型
5、时间信息,比如计算好执行的时间,以便cpu分配
6、标号,决定改变进程归属
7、可以读写打开的一些文件信息
8、进程上下文和内核上下文
9、处理器上下文
10、内存信息
因为每一个PCB都是这样的,只有这样一个结构,才能满足一个进程的需求。打开/include/linux/sched.h可以找到task_struct的定义。
struct tast_struct
{
volatile long state; //说明该进程是否可以执行,还是可中断登信息。
unsigned long flags; //flafs是进程号,在调用fork()时给出
int sigpending; //进程有是否待处理的信号
mm_segment addr_limit; //进程地址空间,区分内核进程与普通进程在内存存放位置的不同,0-0xBFFFFFFFF for user-thead, 0-0xFFFFFFFF for kernel-thread
volatile long need_resched;//调度标志,表示该进程是否需要重新调度,若非0,则当从内核态返回到用户态,会发生调度
int lock_resched ; //锁深度