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.
Ce n'est pas une réponse technique mais une réponse historique à la question spécifique posée par l'OP: "Quelle était la raison de la non-préemption des noyaux Linux plus anciens?"
(Je suppose, comme expliqué par @peterh dans sa réponse et ses commentaires, que par "non-préemption", l'OP fait référence à l'un ou aux deux du fait qu'un seul processus utilisateur pourrait être à l'intérieur du noyau (dans une API) à un l'heure et / ou le Big Kernel Lock.)
Linus Torvalds souhaitait savoir comment fonctionnaient les systèmes d'exploitation et comment il avait appris à en écrire un. Son modèle, sa base et son environnement de développement initial étaient Minix, un système d'exploitation existant à des fins éducatives (c'est-à-dire pas un système d'exploitation de production) qui n'était pas gratuit (comme en open source, à l'époque - ce n'était pas gratuit comme dans la bière, Soit).
Il a donc écrit un noyau sans préemption (le Big Kernel Lock mentionné dans d'autres réponses) parce que c'est la façon dont vous le faites si vous voulez que votre nouveau système d'exploitation soit rapidement opérationnel à des fins éducatives: c'est beaucoup beaucoup plus simple de cette façon. Un noyau pour prendre en charge la multiprogrammation simultanée de programmes utilisateur et de périphériques est déjà assez difficile - il est extrêmement difficile de rendre le noyau lui-même simultané.
S'il avait su à quel point Linux deviendrait populaire / utile / important ... il l'aurait probablement fait de la même manière. (OMI seulement, je n'ai aucune idée de ce qu'il pense réellement.) Parce que tu dois marcher avant de pouvoir courir.
Et cela est resté longtemps ainsi car a) il y avait beaucoup d'autres travaux à faire pour faire de Linux ce qu'il est aujourd'hui (ou même ce qu'il était alors) et b) le changer serait une entreprise difficile et majeure (comme expliqué dans d'autres réponses).
la source