O kernel preemptivo significa apenas que não há Big Kernel Lock .
O Linux tinha multitarefa preemptiva (ou seja, o código do usuário era preemptivo) desde o primeiro momento (até onde eu sei, o primeiro Linux 0.0.1 carregado por Linus no servidor do funet ftp já era multitarefa preemptiva). Se você executou, por exemplo, vários processos de compactação ou compilação, eles foram executados paralelamente desde o primeiro momento.
Ao contrário do - na época - amplamente utilizado Win31. No Win31, se uma tarefa obteve a CPU do "kernel", por padrão, era sua responsabilidade determinar quando devolver o controle ao SO (ou a outras tarefas). Se um processo não tiver suporte especial para esse recurso (que requer trabalho de programação adicional), durante a execução, todas as outras tarefas serão suspensas. Até os aplicativos mais básicos integrados ao Win31 funcionavam.
A multitarefa preemptiva significa que as tarefas não têm como alocar a CPU como desejam. Em vez disso, se o intervalo de tempo expirar, o kernel afastará a CPU deles. Portanto, em sistemas operacionais preventivos, um processo mal escrito ou com mau funcionamento não pode congelar o sistema operacional ou evitar a execução de outros processos. O Linux sempre foi preventivo para processos de espaço do usuário.
O Big Kernel Lock significa que, em alguns casos, dentro do espaço do kernel , ainda pode haver alguns bloqueios, impedindo que outros processos executem o código protegido. Por exemplo, você não pode montar vários sistemas de arquivos simultaneamente - se você der vários comandos de montagem, eles ainda serão executados consecutivamente, porque montar coisas necessárias para alocar o Big Kernel Lock.
Tornar o kernel preemptivo exigia eliminar esse grande bloqueio do kernel, ou seja, tornar o mount e quaisquer outras tarefas capazes de executar simultaneamente. Foi um grande trabalho.
Historicamente, isso foi realmente urgente pelo crescente suporte ao SMP (suporte a várias CPUs). Na primeira vez, havia realmente placas-mãe com várias CPUs. Mais tarde, várias CPUs ("núcleos") foram integradas em um único chip, hoje as placas-mãe com várias CPUs realmente são raras (normalmente em sistemas de servidor dispendiosos). Também os sistemas realmente de núcleo único (onde existe apenas uma única CPU, com um único núcleo) são raros.
Portanto, a resposta para sua pergunta não é "qual foi o motivo da não-preemptividade", porque sempre foi preemptiva. A verdadeira questão é: o que tornou realmente necessária a execução preventiva do kernel . A resposta é para isso: a proporção crescente de sistemas com muitas CPUs e muitos núcleos.