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

5) activated
表示进程因什么原因进入就绪态,这一原因会影响到调度优先级的计算。activated 有四个值:
-1,进程从 TASK_UNINTERRUPTIBLE 状态被唤醒; 
0,缺省值,进程原本就处于就绪态; 
1,进程从 TASK_INTERRUPTIBLE 状态被唤醒,且不在中断上下文中; 
2,进程从 TASK_INTERRUPTIBLE 状态被唤醒,且在中断上下文中。 
activated 初值为 0,在两个地方修改,一是在 schedule() 中,被恢复为 0,另一个就是 activate_task(),这个函数由 try_to_wake_up() 函数调用,用于激活休眠进程: 
如果是中断服务程序调用的 activate_task(),也就是说进程由中断激活,则该进程最有可能是交互式的,因此,置 activated=2;否则置activated=1。 
如果进程是从 TASK_UNINTERRUPTIBLE 状态中被唤醒的,则 activated=-1(在try_to_wake_up()函数中)。 
activated 变量的具体含义和使用见"优化了的优先级计算方式"。 
6) sleep_avg
进程的平均等待时间(以 nanosecond 为单位),在 0 到 NS_MAX_SLEEP_AVG 之间取值,初值为 0,相当于进程等待时间与运行时间的差值。sleep_avg 所代表的含义比较丰富,既可用于评价该进程的"交互程度",又可用于表示该进程需要运行的紧迫性。这个值是动态优先级计算的关键因子,sleep_avg 越大,计算出来的进程优先级也越高(数值越小)。在下文"进程平均等待时间 sleep_avg" 中会详细分析 sleep_avg 的变化过程。
7) interactive_credit
这个变量记录了本进程的"交互程度",在 -CREDIT_LIMIT 到 CREDIT_LIMIT+1 之间取值。进程被创建出来时,初值为 0,而后根据不同的条件加 1 减 1,一旦超过 CREDIT_LIMIT(只可能等于 CREDIT_LIMIT+1),它就不会再降下来,表示进程已经通过了"交互式"测试,被认为是交互式进程了。interactive_credit具体的变化过程在"更精确的交互式进程优先"中会详细描述。
8) nvcsw/nivcsw/cnvcsw/cnivcsw
进程切换计数。
9) time_slice 
进程的时间片余额,相当于 2.4 的 counter,但不再直接影响进程的动态优先级。在"新的运行时间片表现"中专门分析了 time_slice 的行为。
10) first_time_slice 
0 或 1,表示是否是第一次拥有时间片(刚创建的进程)。这一变量用来判断进程结束时是否应当将自己的剩余时间片返还给父进程(见"新的运行时间片表现")。
11) run_list 
前面提到,优先级数组 prio_array 结构中按顺序排列了各个优先级下的所有进程,但实际上数组中每一个元素都是 list_head 结构,以它为表头的链表中的每一个元素也是 list_head,其中链接的就是 task_struct 中的 run_list 成员。这是一个节省空间、加速访问的小技巧:调度器在 prio_array 中找到相应的 run_list,然后通过 run_list 在 task_struct 中的固定偏移量找到对应的 task_struct(参见 enqueue_task()、dequeue_task() 和 list.h 中的操作)。
12) array
记录当前 CPU 的活跃就绪队列(runqueue::active)。
13) thread_info
当前进程的一些运行环境信息,其中有两个结构成员与调度关系紧密:
preempt_count:初值为 0 的非负计数器,大于 0 表示核心不宜被抢占; 
flags:其中有一个 TIF_NEED_RESCHED 位,相当于 2.4 中的 need_resched 属性,如果当前运行中的进程此位为 1,则表示应该尽快启动调度器。 
在 2.4 中,每个进程的 task_struct 都位于该进程核心栈的顶端(低址部分),内核可以通过栈寄存器 ESP 轻松访问到当前进程的 task_struct。在 2.6 中,仍然需要频繁访问这个名为 current 的数据结构,但现在,进程核心栈顶保存的是其中的 thread_info 属性,而不是完整的 task_struct 了。这样做的好处是仅将最关键的、访问最频繁的运行环境保存在核心栈里(仍然是两个页大小),而将 task_struct 大部分内容通过 thread_info::task 指针保存在栈外,以方便扩充。thread_info 的分配方式和访问方式与 2.4 中的 task_struct 完全相同,现在的 current 需要这样来访问:

/* 节选自[include/asm-i386/current.h] */
static inline struct task_struct * get_current(void)
{
return current_thread_info()->task;
}
#define current get_current()
其中current_thread_info()定义为:
/* 节选自[include/asm-i386/thread_info.h] */
static inline struct thread_info *current_thread_info(void)
{
struct thread_info *ti;
__asm__("andl %%esp,%0; ":"=r" (ti) : "0" (~8191UL));
return ti;
}

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