Que signifie "le noyau linux est préventif"?
J'ai lu que le noyau Linux est préventif, ce qui est différent de la plupart des noyaux Unix. Donc, ce que cela signifie vraiment pour un kernel pour être préemptif?
certaines analogies ou exemples seraient mieux que de simples explications théoriques.
8 réponses
Imaginez la vue simple de multitâche préventive. Nous avons deux tâches d'utilisateur, qui sont toutes les deux en cours d'exécution tout le temps sans utiliser d'E/S ou effectuer des appels du noyau. Ces deux tâches n'ont pas à faire quoi que ce soit de spécial pour pouvoir fonctionner sur un système d'exploitation multitâches. Le noyau, typiquement basé sur une interruption de minuterie, décide simplement qu'il est temps pour une tâche de s'arrêter pour laisser une autre s'exécuter. La tâche en question est complètement inconsciente que rien arriver.
cependant, la plupart des tâches font des requêtes occasionnelles du noyau via des appels syscall. Lorsque cela se produit, le même contexte utilisateur existe, mais le CPU exécute le code du noyau au nom de cette tâche.
les noyaux Linux plus anciens n'autoriseraient jamais la préemption d'une tâche alors qu'elle était occupée à exécuter le code du noyau. (Il est à noter que les opérations d'e/s sont toujours programmées de façon volontaire. Je parle d'un cas où le code du noyau a une opération intensive en CPU comme trier liste.)
Si le système permet à cette tâche préemption pendant qu'il exécute le code du noyau, alors nous avons ce qu'on appelle un "noyau préemptif."Un tel système est à l'abri des retards imprévisibles que l'on peut rencontrer lors d'un appel d'offres, de sorte qu'il pourrait être mieux adapté aux tâches intégrées ou en temps réel.
par exemple, si sur un CPU particulier il y a deux tâches disponibles, et l'une prend un syscall qui prend 5ms à compléter, et l'autre est un lecteur MP3 application qui a besoin de nourrir le tuyau audio tous les 2ms, vous pourriez entendre bégaiement audio.
l'argument contre la préemption est que tout le code du noyau qui pourrait être appelé dans le contexte de la tâche doit être capable de survivre à la préemption-- il y a beaucoup de mauvais code de pilote de périphérique, par exemple, qui pourrait être mieux s'il est toujours capable d'effectuer une opération avant de permettre à une autre tâche de s'exécuter sur ce processeur. (Avec les systèmes multi-processeurs la règle plutôt que l'exception de ces jours, tout le code du noyau doit être re-entrant, de sorte que cet argument n'est pas aussi pertinent aujourd'hui.) De plus, si le même objectif pouvait être atteint en améliorant les syscalls avec une mauvaise latence, peut-être la préemption est-elle inutile.
un compromis est CONFIG_PREEMPT_VOLUNTARY, qui permet un commutateur de tâches à certains points du noyau, mais pas partout. S'il n'y a qu'un petit nombre d'endroits où le code du noyau pourrait s'enliser, c'est un moyen bon marché de réduire la latence tout en gardant la la complexité gérable.
avant la version 2.5.4 du noyau Linux, le noyau Linux n'était pas préventif, ce qui signifie qu'un processus tournant en mode noyau ne peut pas être déplacé hors du processeur tant qu'il ne quitte pas le processeur ou qu'il ne commence pas à attendre qu'une opération de sortie d'entrée soit terminée.
généralement un processus en mode utilisateur peut entrer en mode noyau en utilisant des appels système. Auparavant, lorsque le noyau n'était pas préventif, un processus de priorité inférieure pouvait inverser un processus de priorité supérieure en le niant. accès au processeur en appelant à plusieurs reprises des appels système et en restant dans le mode noyau. Même si le délai du processus de priorité inférieure expirait, il continuerait à fonctionner jusqu'à ce qu'il termine son travail dans le noyau ou abandonne volontairement le contrôle. Si le processus prioritaire en attente d'exécution est un éditeur de texte dans lequel l'utilisateur tape ou un lecteur MP3 prêt à remplir son tampon audio, le résultat est une mauvaise performance interactive. De cette façon, le noyau non-préventif a été un inconvénient majeur temps.
les noyaux unix traditionnels avaient une seule serrure, qui était maintenue par un thread pendant que le code du noyau était en cours d'exécution. Par conséquent, aucun autre code du noyau ne peut interrompre ce thread.
cela a rendu la conception du noyau plus facile, puisque vous saviez que même si un thread utilise les ressources du noyau, aucun autre thread ne l'est. Par conséquent, les différents fils ne peuvent pas s'abîmer mutuellement.
Dans les systèmes monoprocesseur cela ne cause pas trop de problèmes.
Toutefois, dans systèmes multiprocesseurs, vous pourriez avoir une situation où plusieurs threads sur des processeurs ou des noyaux différents voulaient tous exécuter le code du noyau en même temps. Cela signifie que selon le type de charge de travail, vous pourriez avoir beaucoup de processeurs, mais chacun d'eux passent la plupart de leur temps à attendre l'autre.
dans Linux 2.6, les ressources du noyau ont été divisées en unités beaucoup plus petites, protégées par des serrures individuelles, et le code du noyau a été revu pour s'assurer que les serrures étaient seulement détenus pendant que les ressources correspondantes étaient utilisées. Alors maintenant, les différents processeurs n'ont qu'à attendre les uns les autres s'ils veulent accéder à la même ressource (par exemple, ressources matérielles).
la préemption permet au noyau de donner une IMPRESSION de parallélisme: vous n'avez qu'un seul processeur (disons il y a une dizaine d'années), mais vous avez l'impression que tous vos processus fonctionnent simultanément. C'est parce que le noyau préempte (c'est-à-dire retire l'exécution) l'exécution d'un processus pour la donner au suivant (peut-être en fonction de leur priorité).
EDIT Pas de souscription des noyaux d'attente pour les processus pour redonner la main (c'est à dire, au cours de syscalls), donc si votre processus calcule beaucoup de données et n'appelle aucune sorte de yield
fonction, les autres processus ne seront pas en mesure d'exécuter leurs appels. De tels systèmes sont dits coopérative parce qu'ils ont de demander la coopération des processus pour assurer l'équité du temps d'exécution
EDIT 2 L'objectif principal de préemption est d'améliorer la réactivité du système entre plusieurs tâches, de sorte que c'est bon pour les utilisateurs finaux, alors que sur d'un autre côté, les serveurs veulent atteindre le plus haut débit, donc ils n'en ont pas besoin: (à partir de la configuration du noyau Linux)
- noyau Préemptible (faible latence de bureau)
- préemption volontaire du noyau (bureau)
- pas de préemption forcée (serveur)
cela signifie que le planificateur du système d'exploitation est libre de suspendre l'exécution des processus en cours pour donner le processeur à un autre processus quand il le veut; la façon normale de faire ceci est de donner à chaque processus qui attend le processeur un "quantum" de temps CPU à exécuter. Après son expiration, l'ordonnanceur reprend le contrôle (et le processus en cours ne peut l'éviter) pour donner un autre quantum à un autre processus.
Cette méthode est souvent comparé avec la coopérative multitâche, dans laquelle les processus gardent le CPU pour tout le temps dont ils ont besoin, sans être interrompus, et pour laisser tourner d'autres applications ils doivent appeler explicitement une sorte de fonction "rendement"; naturellement, pour éviter de donner l'impression que le système est bloqué, les applications bien conduites donneront souvent le CPU. Néanmoins,s'il y a un bug dans une application (par exemple une boucle infinie sans appels de rendement) , le système entier sera suspendu, puisque le CPU est complètement maintenu par le défaut programme.
presque toutes les OSes de bureau récentes utilisent multitâche préventive, qui, même si elle est plus chère en termes de ressources, est en général plus stable (il est plus difficile pour une application défectueuse sigle d'accrocher l'ensemble du système, puisque L'OS est toujours en contrôle). D'autre part, lorsque les ressources sont serrés et la demande devraient être bien comportés, le multitâche coopératif est utilisé. Windows 3 était une coopérative multitâche OS; un exemple plus récent peut être RockBox, un remplacement du micrologiciel opensource PMP.
le noyau linux est monolithique et donne un peu de temps de calcul à tout le processus d'exécution séquentiellement. Cela signifie que les processus (p. ex. les programmes) ne s'exécutent pas en même temps, mais on leur donne un intervalle de temps donné régulièrement pour exécuter leur logique. Le problème principal est qu'une certaine logique peut prendre plus de temps pour terminer et empêcher le noyau de laisser du temps pour le prochain processus. Il en résulte un "décalage"du système.
un noyau préemtif a la capacité de commutateur contexte. Cela signifie qu'il peut arrêter un processus "suspendu" même s'il n'est pas terminé, et donner le temps de calcul pour le prochain processus comme prévu. Le processus de "suspension" continuera de s'exécuter lorsque son heure sera venue sans aucun problème.
pratiquement, cela signifie que le noyau a la capacité d'accomplir des tâches en temps réel, ce qui est particulièrement intéressant pour l'enregistrement audio et le montage.
ubuntu studio District ensembles de préemption kernel ainsi qu'un bouch de logiciel libre de qualité consacré à l'édition audio et vidéo.
je pense que c'est devenu de préemption de 2.6. préemptive signifie que lorsqu'un nouveau processus est prêt à être exécuté, le cpu sera affecté au nouveau processus, il n'a pas besoin que le processus en cours soit coopératif et abandonne le cpu.
le noyau Linux est préventif signifie que le noyau supporte la préemption.
par exemple, il y a deux processus P1(priorité supérieure) et P2(priorité inférieure) qui font des appels système de lecture et qui tournent en mode noyau. Supposons que P2 tourne et est en mode noyau et que P2 est programmé pour tourner.
si la préemption du noyau est disponible, alors la préemption peut se produire au niveau du noyau I. E P2 peut être préempté et mais de dormir et le P1 peut continuer à exécuter.
si la préemption du noyau n'est pas disponible, puisque P2 est en mode noyau, le système attend simplement Jusqu'à ce que P2 soit complet et ensuite