Geralmente, o modo como os dispositivos de entrada funcionam é, quando são usados, uma interrupção (IRQ) é gerada. (Os únicos dispositivos que não são assim seriam a antiga porta de jogos no estilo PC, e não sei como o sistema operacional lida com isso.)
Os IRQs fazem com que um núcleo da CPU salte imediatamente para outro lugar - o manipulador de IRQ precisa salvar o estado da CPU, lidar com o dispositivo (como capturar a entrada e relate-o através de qualquer mecanismo do SO) e, em seguida, retorne da interrupção.
Os IRQs também fazem com que o núcleo da CPU desative mais interrupções. Assim, por um breve período de tempo, ele não pode fazer mais nada ou ser interrompido novamente, mesmo que um dispositivo tente acionar outra interrupção. Os PCs têm hardware APIC que está strongmente envolvido no controle, distribuição e gerenciamento de interrupções, portanto considere isso uma simplificação excessiva. (Por exemplo, acho que o APIC pode lembrar se outro IRQ entra enquanto a CPU está processando um, e imediatamente acionar no lado da CPU logo após a CPU informar ao APIC "hey, eu terminei com este IRQ.")
O Windows lida com interrupções por meio de algo chamado "chamada de procedimento adiada" - ele faz o mínimo necessário neste estado "interrompido" para obter o pedido do dispositivo reconhecido e, em seguida, transfere o restante do processamento para o driver de dispositivo real responsável , que cuida disso quando o agendador acha conveniente ou necessário.
Portanto, por causa disso, o Windows deve reconhecer o IRQ causado por cada dispositivo, a menos que esteja em um estado interrompido em algum lugar devido a um driver defeituoso, dispositivo defeituoso ou corrupção grave de binários do sistema operacional. Os DPCs que realmente fazem com que o Windows faça algo interessante com a solicitação do dispositivo podem ser o que fica atrasado.
A maneira geral para um sistema operacional forçar um processo a desistir da CPU é ter um temporizador de hardware que, quando se esgota, causa um IRQ. O mesmo tipo de IRQ, conforme descrito acima. IRQs sempre fazem com que a CPU mude para o modo kernel. Então, nesse ponto, o kernel tem controle e pode mudar para outro processo. Sem esse mecanismo, você depende totalmente do processo para informar ao sistema operacional quando isso é feito, e isso é chamado de "multitarefa cooperativa" em vez de "multitarefa preventiva".