2.3.2 O(n)调度器 - 时间分配
asmlinkage void schedule(void) { if (unlikely(prev->policy == SCHED_RR)) if (!prev->counter) { prev->counter = NICE_TO_TICKS(prev->nice); move_last_runqueue(prev); } }
/* file: kernel/sched.c */
asmlinkage void schedule(void) {
/* 删除前面的代码 */
/* 1. 遍历队列 */
repeat_schedule:
next = idle_task(this_cpu);
c = -1000;
list_for_each(tmp, &runqueue_head) {
p = list_entry(tmp, struct task_struct, run_list);
if (can_schedule(p, this_cpu)) { /* 判断 p 是否可以在 this_cpu 上运行 */
int weight = goodness(p, this_cpu, prev->active_mm);
if (weight > c)
c = weight, next = p;
}
}
/* 2. 通过 c 判断是否有合适的任务被选中 */
if (unlikely(!c)) {
struct task_struct *p;
spin_unlock_irq(&runqueue_lock);
read_lock(&tasklist_lock);
/* 遍历系统的所有任务,并为其分配运行时间 */
for_each_task(p) p->counter = (p->counter >> 1) + NICE_TO_TICKS(p->nice);
read_unlock(&tasklist_lock);
spin_lock_irq(&runqueue_lock);
/* 分配完运行时间后重新调度 */
goto repeat_schedule;
}
}
/* 删除后面的代码 */Last updated