1.2 完成进程切换时所执行的操作
找到next进程之后,就是要将该进程投入运行了。此时schedule()函数将进行如下操作:
(1)首先内核会立即访问next进程的thread_info数据结构,其地址存放在next进程描述符的接近顶部的位置。
prefetch(next);
prefetch宏提示CPU控制单元把next的进程描述符第一部分字段的内容装入高速缓存。
(2)在替代prev之前,调度程序应该完成一些管理工作:
clear_tsk_need_resched(prev);
rcu_qsctr_inc(task_cpu(prev));
为了防止schedule()函数以延迟方式被调用,调用clear_tsk_need_resched()函数来清除prev的TIF_NEED_RESCHED标志。然后,函数记录CPU正在经历静止状态(quiescent state)。
之后还要必须减少prev的平均睡眠时间,并把它补充给进程所使用的CPU时间片:
prev->sleep_avg -= run_time;
if ((long)prev->sleep_avg <= 0)
prev->sleep_avg = 0;
prev->timestamp = prev->last_ran = now;