 
 
 
 
 
 
 
  
Jak pamiętamy funckja reschedule_idle wywołana z procesem p w parametrze sprawdza, czy proces ten może wywłaszczyć jakiś inny działający. Jeżeli tak, to powoduje wywołanie funkcji schedule(), która to zrobi.
Funkcja w wersji obsługującej wieloprocesorowość robi generalnie to samo: szuka dla procesu p najbardziej odpowiedniego procesora, na którym działa proces, którego p może wywłaszczyć.
Algorytm:
  best_cpu = p->processor;
  if (can_schedule(p, best_cpu)) {
      tsk = idle_task(best_cpu);
      if (cpu_curr(best_cpu) == tsk) {
         int need_resched;
send_now_idle:
          need_resched = tsk->need_resched;
          tsk->need_resched = 1;
          if ((best_cpu != this_cpu) && !need_resched)
          smp_send_reschedule(best_cpu);
          return;
      }
  }
Jeżeli to się nie uda wykonywany jest następny punkt:
Oto kod znajdujący proces do wywłaszczenia:
oldest_idle = (cycles_t) -1; target_tsk = NULL; max_prio = 1; 
for (i = 0; i < smp_num_cpus; i++) {     
  cpu = cpu_logical_map(i);     
  if (!can_schedule(p, cpu)) continue;     
  tsk = cpu_curr(cpu);     
  if (tsk == idle_task(cpu)) {         
    if (last_schedule(cpu) < oldest_idle) {                 
      oldest_idle = last_schedule(cpu);                 
      target_tsk = tsk;         
    }     
  } else if (oldest_idle == -1ULL) {         
    int prio = preemption_goodness(tsk, p, cpu);         
    if (prio > max_prio) { max_prio = prio; target_tsk = tsk; }     
  } 
}
tsk = target_tsk;
Wywłaszczenie jest wykonywane podobnie jak w punkcie 1 (patrz etykieta send_now_idle:).
W ten sposób został rozwiązany problem postawiony na początku rozdziału.
 
 
 
 
 
 
