next up previous contents
Next: Wartość pola state Up: Opóźnione wywołanie schedule() (przez Previous: Opóźnione wywoływanie w funkcji   Spis rzeczy

Opóźnione wywoływanie przy budzeniu procesu

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;
}



Ignacy Kowalczyk 2001-11-16