No contexto do kernel do Linux, quando as pessoas falam sobre preempção, elas geralmente se referem à capacidade do kernel de interromper a si mesmo - essencialmente, alternar tarefas durante a execução do código do kernel. Permitir que isso aconteça é bastante complexo, o que provavelmente é a principal razão pela qual levou muito tempo para o kernel se tornar preemptível.
No início, a maioria dos códigos do kernel não podia ser interrompida de qualquer maneira, já que era protegida pelo grande bloqueio do kernel. Esse bloqueio foi progressivamente eliminado de mais e mais códigos do kernel, permitindo múltiplas chamadas simultâneas ao kernel em paralelo (o que se tornou mais importante à medida que os sistemas SMP se tornaram mais comuns). Mas isso ainda não tornou o kernel em si preemptível; que levou ainda mais desenvolvimento, culminando no conjunto de patches PREEMPT_RT
que acabou sendo mesclado no kernel mainline (e era capaz de antecipar o BKL de qualquer maneira). Atualmente, o kernel pode ser configurado para ser mais ou menos preemptível, dependendo das características de taxa de transferência e latência que você procura; veja a configuração de kernel relacionada detalhes.
Como você pode ver nas explicações na configuração do kernel, a preempção afeta a taxa de transferência e a latência, não a simultaneidade. Em sistemas de CPU única, a preferência ainda é útil porque permite que os eventos sejam processados com tempos de reação mais curtos; no entanto, isso também resulta em menor taxa de transferência (já que o kernel gasta tarefas de comutação de tempo). A preempção permite que qualquer CPU, em um sistema de CPU único ou múltiplo, mude para outra tarefa mais rapidamente. O fator limitador em sistemas com várias CPUs não é de prevenção, são bloqueios, grandes ou não: qualquer código de tempo bloqueia, isso significa que outra CPU não pode começar a realizar a mesma ação.