Opóźnione wywołanie polega na ustawieniu pola need_resched w deskryptorze aktualnego procesu. Wywołanie schedule() napewno nastąpi jeszcze przed powrotem aktualnego procesu do trybu użytkownika. Zapewnia to następujący kawałek kodu assemblerowego (wycięty z pliku arch/i386/kernel/entry.S wywoływanego przy powrocie z wywołan systemowych, przerwań i wyjątków:
ENTRY(ret_from_sys_call) cli # need_resched and signals atomic test cmpl $0,need_resched(%ebx) # ebx zawiera adres deskryptora procesu jne reschedule cmpl $0,sigpending(%ebx) jne signal_return ... reschedule: call SYMBOL_NAME(schedule) # test jmp ret_from_sys_call ...
Opóźnione wywołanie występuje w następujących sytuacjach: