Обычно устройства ввода работают, когда они используются, генерируется прерывание (IRQ). (Единственными устройствами, не такими, как это, был бы старый игровой порт в стиле ПК, и я не уверен, как с этим справится операционная система.)
IRQ заставляют ядро ЦП немедленно перейти в другое место - обработчик IRQ должен затем сохранить состояние ЦП, обработать устройство (например, перехватить ввод и сообщить о нем через любой механизм ОС), а затем вернуться из прерывания.
IRQ также заставляют ядро ЦП отключать дальнейшие прерывания. Таким образом, в течение короткого периода времени он не может делать что-либо еще или прерываться снова, даже если устройство пытается вызвать другое прерывание. ПК имеют аппаратное обеспечение APIC, которое активно участвует в управлении, распределении и управлении прерываниями, поэтому, тем не менее, это упрощение. (Например, я думаю, что APIC может запомнить, если другой IRQ входит, когда процессор обрабатывает его, и сразу же запустить его на стороне процессора сразу после того, как процессор скажет APIC «эй, я сделал этот IRQ».)
Windows обрабатывает прерывания через нечто, называемое "отложенным вызовом процедуры" - она делает минимум, необходимый в этом "прерванном" состоянии, чтобы подтвердить запрос устройства, а затем передает оставшуюся обработку фактическому ответственному драйверу устройства, который принимает заботиться об этом, когда планировщик находит это удобным или необходимым.
Поэтому из-за этого Windows должна подтверждать каждый вызванный устройством IRQ, если он не застрял где-то в прерванном состоянии из-за неисправного драйвера, неисправного устройства или серьезного повреждения двоичных файлов операционной системы. DPC, которые фактически заставляют Windows делать что-то интересное с запросом устройства, могут быть задержаны.
Общий способ для операционной системы заставить процессор отказаться от процессора - это иметь аппаратный таймер, который, когда он заканчивается, вызывает IRQ. IRQ того же типа, что и описанный выше. IRQ всегда заставляют процессор переключаться в режим ядра. Таким образом, в этот момент ядро имеет контроль и может переключиться на другой процесс. Без этого механизма вы полностью зависите от процесса, который сообщит операционной системе, когда он будет выполнен, и это то, что называется "совместная многозадачность", а не "упреждающая многозадачность".