Le noyau préemptif signifie seulement qu'il n'y a pas de Big Kernel Lock .
Linux avait des tâches multitâches préemptives (c'est-à-dire que le code utilisateur était préemptif) depuis son premier moment (pour autant que je sache, le tout premier Linux 0.0.1 téléchargé par Linus sur le serveur ftp funet était déjà multitâche préemptif). Si vous avez exécuté, par exemple, plusieurs processus de compression ou de compilation, ils ont été exécutés en parallèle dès le premier instant.
Contrairement à - à l'époque - largement utilisé Win31. Sur Win31, si une tâche a obtenu le CPU du "noyau", par défaut, il lui appartenait de déterminer quand redonner le contrôle à l'OS (ou à d'autres tâches). Si un processus n'avait pas de support spécial pour cette fonctionnalité (qui nécessitait un travail de programmation supplémentaire), alors pendant son exécution, toutes les autres tâches étaient suspendues. Même la plupart des applications de base intégrées au Win31 fonctionnaient ainsi.
Le multitâche préemptif signifie que les tâches n'ont aucun moyen d'allouer le processeur comme elles le souhaitent. Au lieu de cela, si leur intervalle de temps expire, le noyau les éloigne du processeur. Ainsi, dans les systèmes d'exploitation préemptifs, un processus mal écrit ou fonctionnant mal ne peut pas geler le système d'exploitation ou empêcher l'exécution d'autres processus. Linux a toujours été préemptif pour les processus d'espace utilisateur.
Le Big Kernel Lock signifie que dans certains cas, à l' intérieur de l'espace du noyau , il pourrait toujours y avoir des verrous, empêchant d'autres processus d'exécuter le code protégé. Par exemple, vous ne pouviez pas monter plusieurs systèmes de fichiers simultanément - si vous donniez plusieurs commandes de montage, elles étaient toujours exécutées consécutivement, car le montage des éléments requis pour allouer le Big Kernel Lock.
Pour rendre le noyau préemptif, il fallait éliminer ce gros verrou du noyau, c'est-à-dire rendre le montage et toutes les autres tâches pouvoir s'exécuter simultanément. C'était un gros travail.
Historiquement, cela était rendu vraiment urgent par le support croissant de SMP (support multi-CPU). Dans un premier temps, il y avait vraiment des cartes mères multi-CPU. Plus tard, plusieurs CPU ("cores") ont été intégrés dans une seule puce, aujourd'hui les cartes mères vraiment multi-CPU sont déjà rares (elles sont généralement dans des systèmes de serveurs coûteux). De plus, les systèmes vraiment monocœurs (où il n'y a qu'un seul processeur, avec un seul cœur) sont rares.
Ainsi, la réponse à votre question n'est pas "quelle était la raison de la non-préemption", car elle a toujours été préemptive. La vraie question est de savoir ce qui rendait l'exécution préemptive du noyau vraiment nécessaire . La réponse est pour cela: le rapport croissant des systèmes à plusieurs processeurs et à plusieurs cœurs.