next up previous contents
Next: Wartość pola state Up: Bezpośrednie wywoływanie schedule() Previous: Makra z rodziny wait_event   Spis rzeczy

Zegary dynamiczne

Gdy jądro chce zablokować aktualny proces na pewien ustalony czas wywołuje funkcję schedule_timeout zdefiniowaną w kernel/sched.c.

signed long schedule_timeout(signed long timeout)
{
  struct timer_list timer;
  unsigned long expire;
  switch (timeout)
  {
    case MAX_SCHEDULE_TIMEOUT:
      schedule();
      goto out;
    default:
      if (timeout < 0)
      {
        ...
      }
  }
  expire = timeout + jiffies;
  init_timer(&timer);
  timer.expires = expire;
  timer.data = (unsigned long) current;
  timer.function = process_timeout;
  add_timer(&timer);
  schedule();
  del_timer_sync(&timer);
  timeout = expire - jiffies;
out:
  return timeout < 0 ? 0 : timeout;
}

Gdy zegar dynamiczny odliczy ustawiony czas wywoła funkcję process_timeout zdefiniowaną w kernel/sched.c która daje szansę zatrzymanemu procesowi wznowić działanie:

static void process_timeout(unsigned long __data)
{
  struct task_struct * p = (struct task_struct *) __data;
  wake_up_process(p);
}



Ignacy Kowalczyk 2001-11-16