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