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