57 votes

Qu'est-ce que la préemption / Qu'est-ce qu'un noyau préemptible? À quoi cela sert-il?

Expliquez en vos propres mots, qu'est-ce que la préemption et que signifie-t-elle pour un noyau (Linux) ?

Quels sont les avantages et les inconvénients d'avoir un noyau préemptible ?

65voto

shoosh Points 34322

La commutation préemptive des tâches - Exécution de plusieurs processus/fils sur un seul processeur, créant l'illusion qu'ils s'exécutent simultanément alors qu'en réalité, chacun reçoit de petits tranches de temps multiplexées pour s'exécuter. Un processus est "préempté" lorsqu'il est programmé pour quitter l'exécution et attendre la prochaine tranche de temps pour s'exécuter.

Un noyau préemptif est un noyau qui peut être interrompu en plein milieu de l'exécution du code - par exemple en réponse à un appel système - pour faire d'autres choses et exécuter d'autres fils, éventuellement ceux qui ne sont pas dans le noyau.

Le principal avantage d'un noyau préemptif est que les appels système ne bloquent pas l'ensemble du système. Si un appel système prend du temps pour se terminer, cela ne signifie pas que le noyau ne peut rien faire d'autre pendant ce temps. Le principal inconvénient est que cela introduit plus de complexité dans le code du noyau, car il doit gérer plus de cas de figure, effectuer davantage de verrouillages fins ou utiliser des structures et algorithmes sans verrou.

15voto

BobbyShaftoe Points 19925

Vous devriez vraiment utiliser le terme "préemptif". Il existe différents types de préemption. Fondamentalement, c'est très simple et vous comprenez probablement cela sous un autre nom. Un système d'exploitation préemptif peut basculer entre les threads en mode utilisateur sans aucun programmation spéciale dans l'application préemptée. Cela permet le multitâche. Un SE peut basculer vers un processus et revenir, et cette commutation est essentiellement transparente. Il existe également ce qu'on appelle un noyau préemptif, qui permet à des threads en mode noyau d'être préemptés (la plupart des systèmes d'exploitation ne le permettent pas mais c'est nécessaire pour certaines applications telles que dans les systèmes en temps réel). Remarquez, ceci est une explication très simplifiée.

11voto

Nan Xiao Points 7240

Je pense que ce message explique vos questions:

qu'est-ce que la préemption?

La capacité du système d'exploitation à préempter ou arrêter une tâche actuellement planifiée au profit d'une tâche de priorité supérieure. La planification peut être liée à la gestion des processus ou des E/S, entre autres.

qu'est-ce qu'un noyau avec préemption?

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

Cependant, jusqu'aux versions 2.6 du noyau, le noyau lui-même n'était pas préemptible : dès qu'un thread entrait dans le noyau, il ne pouvait pas être préempté pour exécuter un autre thread. Le processeur pouvait être utilisé pour exécuter un autre thread lorsqu'un appel système se terminait, ou lorsque le thread actuel demandait explicitement au planificateur d'exécuter un autre thread en utilisant la fonction schedule(). Cela signifie qu'une boucle infinie dans le code noyau bloquait l'ensemble du système, mais ce n'est pas vraiment un problème : le code noyau est conçu de manière à éviter les boucles infinies.

La préemption du noyau a été introduite dans les versions 2.6 des noyaux, et on peut l'activer ou la désactiver en utilisant l'option CONFIG_PREEMPT. Si CONFIG_PREEMPT est activé, alors le code 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 l'ensemble du système. Si CONFIG_PREEMPT est désactivé, alors le comportement de la version 2.4 est restauré.

Avantages et inconvénients?

Avantages: Le noyau avec préemption peut améliorer la latence et la scalabilité, et permettre à des tâches de haute priorité de s'exécuter et de répondre rapidement.

Inconvénients: Cela rend l'écriture du code difficile dans un noyau avec préemption, en particulier en SMP, et vous devez prendre en compte de nombreux facteurs.

7voto

MarkR Points 37178

D'autres ont expliqué de manière adéquate ce qu'est un noyau préemptible.

À quoi cela sert-il ?

La plupart des avantages sont les suivants :

  • Latence plus faible sur les systèmes non SMP - généralement utilisée dans les systèmes en temps réel ou pour d'autres applications où la latence est importante (audio, applications vidéo peut-être)
  • Enseigner aux développeurs de noyaux ne disposant pas de systèmes SMP comment écrire un code correct pour SMP

Avec un noyau non préemptible, sur un système monoprocesseur, il est possible aux développeurs de noyau de se montrer paresseux et d'éviter les verrouillages la plupart du temps - bien entendu, ceci est un échec majeur sur SMP. Les noyaux préemptibles leur permettent de ressentir cette douleur sans plus de cœurs.

4voto

Jeff Points 1316

La préemption signifie que le système d'exploitation prend en charge plusieurs tâches (un morceau de code séparé et autonome) et passera d'une tâche à l'autre selon un horaire. Lorsqu'une tâche est interrompue, on l'appelle "préemption". Les systèmes d'exploitation modernes prennent en charge cela - mais ce n'est pas nécessaire pour les systèmes embarqués simples, par exemple. Les coûts indirects de la commutation de tâches ne sont pas toujours justifiés.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X