linux2.4到linux2.6内核调度(5)

调度系统代码结构 绝大多数调度系统的实现代码,包括 runqueue 结构的定义,都在[kernel/sched.c]文件中,这样做的目的是将所有调度系统的代码集中起来,便于更新和替换。除非特别注明,本文所引代码和函数实现均位于[kernel/sched.c]中。

3. 改进后的 task_struct

2.6 版的内核仍然用 task_struct 来表征进程,尽管对线程进行了优化,但线程的内核表示仍然与进程相同。随着调度器的改进,task_struct 的内容也有了改进,交互式进程优先支持、内核抢占支持等新特性,在 task_struct 中都有所体现。在 task_struct 中,有的属性是新增加的,有的属性的值的含义发生了变化,而有的属性仅仅是改了一下名字。

1) state

进程的状态仍然用 state 表示,不同的是,2.6 里的状态常量重新定义了,以方便位操作:

/* 节选自[include/linux/sched.h] */

#define TASK_RUNNING                0

#define TASK_INTERRUPTIBLE          1

#define TASK_UNINTERRUPTIBLE        2

#define TASK_STOPPED                4

#define TASK_ZOMBIE                 8

#define TASK_DEAD        16

新增加的TASK_DEAD指的是已经退出且不需要父进程来回收的进程。

2) timestamp

进程发生调度事件的时间(单位是 nanosecond,见下)。包括以下几类:

  • 被唤醒的时间(在 activate_task() 中设置); 

  • 被切换下来的时间(schedule()); 

  • 被切换上去的时间(schedule()); 

  • 负载平衡相关的赋值(见"调度器相关的负载平衡")。 

从这个值与当前时间的差值中可以分别获得"在就绪队列中等待运行的时长"、"运行时长"等与优先级计算相关的信息(见"优化了的优先级计算方法")。

你可能感兴趣的:(linux2.4到linux2.6内核调度(5))