GNU/Linux >> Tutoriels Linux >  >> Linux

Quelle est la différence entre le noyau préemptif non préemptif, préemptif et préemptif sélectif ?

Sur un noyau préemptif, un processus s'exécutant en mode noyau peut être remplacé par un autre processus au milieu d'une fonction noyau.

Cela ne s'applique qu'aux processus exécutés en mode noyau, un processeur exécutant des processus en mode utilisateur est considéré comme "inactif". Si un processus en mode utilisateur veut demander un service au noyau, il doit émettre une exception que le noyau peut gérer.

Par exemple :

Traiter A exécute un gestionnaire d'exceptions, Process B est réveillé par une requête IRQ, le noyau remplace le processus A avec B (un commutateur de processus forcé). Traiter A est laissé inachevé. Le planificateur décide ensuite si le processus A obtient ou non du temps CPU.

Sur un noyau non préemptif, traitez A aurait simplement utilisé tout le temps du processeur jusqu'à ce qu'il ait terminé ou décide volontairement d'autoriser d'autres processus à l'interrompre (un changement de processus planifié).

Les systèmes d'exploitation basés sur Linux d'aujourd'hui n'incluent généralement pas de noyau entièrement préemptif, il existe toujours des fonctions critiques qui doivent s'exécuter sans interruption. Je pense donc que vous pourriez appeler cela un "noyau préemptif sélectif".

En dehors de cela, il existe des approches pour rendre le noyau Linux (presque) entièrement préemptif.

  • Wiki Linux en temps réel
  • Article LWN

la préemption est -> La capacité du système d'exploitation à préempter ou à arrêter une tâche actuellement planifiée en faveur d'une tâche de priorité plus élevée. La planification peut être, mais sans s'y limiter, la planification de processus ou d'E/S, etc.

Sous Linux, les programmes de l'espace utilisateur ont toujours été préemptifs :le noyau interrompt les programmes de l'espace utilisateur pour basculer vers d'autres threads, en utilisant le tic d'horloge régulier. Ainsi, le noyau n'attend pas que les programmes de l'espace utilisateur libèrent explicitement le processeur (ce qui est le cas dans le multitâche coopératif). Cela signifie qu'une boucle infinie dans un programme en espace utilisateur ne peut pas bloquer le système.

Cependant, jusqu'aux noyaux 2.6, le noyau lui-même n'était pas préemptif :dès qu'un thread était entré dans le noyau, il ne pouvait pas être préempté pour exécuter un autre thread. Cependant, cette absence de préemption dans le noyau posait plusieurs problèmes de latence et d'évolutivité. Ainsi, la préemption du noyau a été introduite dans les noyaux 2.6, et on peut l'activer ou la désactiver en utilisant l'option CONFIG_PREEMPT. Si CONFIG_PREEMPT est activé, alors le code du noyau peut être préempté partout, sauf lorsque le code a désactivé les interruptions locales. Une boucle infinie dans le code ne peut plus bloquer tout le système. Si CONFIG_PREEMPT est désactivé, alors le comportement 2.4 est restauré.

Recité et formaté depuis :http://www.linuxquestions.org/questions/linux-general-1/pre-emptive-vs-non-preemptive-kernel-582437/


Linux
  1. La Différence Entre [[ $a ==Z* ]] Et [ $a ==Z* ] ?

  2. Quelle est la différence entre module_init et init_module dans un module du noyau Linux ?

  3. Quelle est la différence entre strtok_r et strtok_s en C ?

  4. Quelle est la différence entre adduser et useradd ?

  5. Quelle est la différence entre les pilotes du noyau et les modules du noyau ?

Quelle est la différence entre les noyaux macOS et Linux

Quelle est la différence entre Linux et Unix ?

Qu'est-ce qu'un Hyperviseur ? Quelle est la différence entre les types 1 et 2 ?

Quelle est la différence entre curl et Wget ?

Quelle est la différence entre $(CC) et $CC ?

Quelle est la différence entre la route et la route IP ?