Do budzenia procesu p służy funkcja wake_up_process(struct task_struct *p). Oto kod tej funkcji wycięty z pliku kernel/sched.c. Kod ten został zmieniony tak, że nie obsługuje SMP.
inline int wake_up_process(struct task_struct * p) { unsigned long flags; int success = 0; spin_lock_irqsave(&runqueue_lock, flags); p->state = TASK_RUNNING; if (task_on_runqueue(p)) goto out; add_to_runqueue(p); reschedule_idle(p); success = 1; out: spin_unlock_irqrestore(&runqueue_lock, flags); return success; }
Wywoływana funkcja reschedule_idle(p) zdefiniowana w pliku kernel/sched.c sprawdza, czy budzony proces ma wyższy proces niż aktualny proces. Jeżeli tak, wywołuje z opóźnieniem funkcję schedule(), która będzie mogła wywłaszczyć działający proces.
Oto uproszczony kod (z wyciętą obsługą SMP) funckji reschedule_idle():
static void reschedule_idle(struct task_struct * p) { int this_cpu = smp_processor_id(); struct task_struct *tsk; tsk = cpu_curr(this_cpu); if (preemption_goodness(tsk, p, this_cpu) > 1) tsk->need_resched = 1; }