Em um kernel preemptivo, um processo em execução no modo kernel pode ser substituído por outro processo enquanto no meio de uma função do kernel.
Isso se aplica apenas aos processos em execução no modo kernel, uma CPU executando processos no modo de usuário é considerada "inativa". Se um processo no modo de usuário quiser solicitar um serviço do kernel, ele deve emitir uma exceção que o kernel possa manipular.
Como exemplo:
Processo A
executa um manipulador de exceções, Processo B
é ativado por uma solicitação de IRQ, o kernel substitui o processo A
por B
(um comutador de processo forçado). O processo A
é deixado inacabado. O agendador decide depois se o processo A
recebe ou não o tempo de CPU.
Em um kernel não preemptivo, o processo A
teria usado todo o tempo do processador até que ele termine ou voluntariamente decida permitir que outros processos o interrompam (uma comutação de processo planejada).
Os sistemas operacionais atuais baseados em Linux geralmente não incluem um kernel totalmente preventivo, ainda existem funções críticas que precisam ser executadas sem interrupção. Então eu acho que você poderia chamar isso de "kernel preventivo seletivo".
Além disso, existem abordagens para tornar o kernel Linux (quase) totalmente preventivo.