web-dev-qa-db-fra.com

Qu'est-ce que la préemption / Qu'est-ce qu'un noyau préemtible? À quoi ça sert?

Expliqué dans vos propres mots, qu'est-ce que la préemption et qu'est-ce que cela signifie pour un noyau (linux)?

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

56
Markus Lux

Multitâche préemptif - Exécution de plusieurs processus/threads sur un seul processeur, créant l'illusion qu'ils s'exécutent simultanément alors que chacun se voit allouer de petites tranches de temps multiplexées à exécuter. Un processus est "préempté" lorsqu'il est programmé hors d'exécution et attend la tranche la prochaine fois pour courir.

Un noyau préemptif est un noyau qui peut être interrompu au 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 threads, éventuellement ceux qui ne sont pas dans le noyau.

Le principal avantage d'un noyau préemptif est que les appels sys ne bloquent pas l'ensemble du système. Si un appel système prend beaucoup de temps pour se terminer, cela ne signifie pas que le noyau ne peut rien faire d'autre pendant cette période. Le principal inconvénient est que cela introduit plus de complexité dans le code du noyau, devant gérer plus de cas finaux, effectuer un verrouillage plus fin ou utiliser des structures et des algorithmes sans verrouillage.

65
shoosh

Vous devriez vraiment utiliser le terme "préemptif". Il existe différents types de préemption. Essentiellement, c'est très simple et vous comprenez probablement cela par un autre nom. Un système d'exploitation préemptif peut basculer les contextes entre les threads en mode utilisateur sans aucune programmation spéciale dans l'application préemptée. Cela permet le multitâche. Un système d'exploitation peut basculer et revenir à un processus et cette commutation est essentiellement transparente. Il existe également un noyau préemptif, qui permet de préempter les threads en mode noyau (la plupart des systèmes d'exploitation ne le permettent pas, mais il est requis pour certaines applications comme dans les systèmes en temps réel). Remarque, ceci est une explication très simplifiée.

15
BobbyShaftoe

Je pense que cela post explique vos questions:

qu'est-ce que la préemption?

La capacité du système d'exploitation à anticiper ou à arrêter une tâche actuellement planifiée au profit d'une tâche de priorité plus élevée. La planification peut être, mais sans s'y limiter, la planification des processus ou des E/S, etc.

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

Sous Linux, les programmes de l'espace utilisateur ont toujours été préemptifs: le noyau interrompt les programmes de l'espace utilisateur pour passer à d'autres threads, en utilisant le tick d'horloge normal. Ainsi, le noyau n'attend pas que les programmes de l'espace utilisateur libèrent explicitement le processeur (ce qui est le cas en 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'à 2.6 noyaux, le noyau lui-même n'était pas préemtible: dès qu'un thread est entré dans le noyau, il ne pouvait pas être empêché d'exécuter un autre thread. Le processeur peut être utilisé pour exécuter un autre thread lorsqu'un appel système est terminé, ou lorsque le thread actuel demande explicitement au planificateur d'exécuter un autre thread à l'aide de la fonction Schedule (). Cela signifie qu'une boucle infinie dans le code du noyau a bloqué l'ensemble du système, mais ce n'est pas vraiment un problème: le code du noyau est conçu pour qu'il n'y ait pas de boucles infinies.

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é, 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 l'ensemble du système. Si CONFIG_PREEMPT est désactivé, le comportement 2.4 est restauré.

Avantages et inconvénients?

Avantages: Le noyau de préemption peut améliorer la latence et l'évolutivité, et il peut exécuter et répondre en temps opportun des tâches de haute priorité.

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

7
Nan Xiao

D'autres ont bien expliqué ce qu'est un noyau préemptif.

À quoi ça sert?

Les avantages sont principalement:

  • 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 choses où la latence est importante (applications audio, vidéo peut-être)
  • Enseigner aux développeurs de noyaux qui n'ont pas de systèmes SMP comment écrire le code correct pour SMP

Avec un noyau non préemptif, sur un système à processeur unique, il est possible pour les développeurs de noyau d'être paresseux et de s'en tirer sans verrouillage la plupart du temps - bien sûr, c'est un gros échec sur SMP. Les grains préemptifs leur permettent d'obtenir cette douleur sans plus de noyaux.

7
MarkR

La préemption signifie que le système d'exploitation prend en charge plusieurs tâches (un morceau de code distinct et autonome) et basculera entre les tâches selon un calendrier. Lorsqu'une tâche est interrompue, elle est appelée "préemption". Le système d'exploitation moderne le prend en charge - mais ce n'est pas requis pour les systèmes embarqués simples, par exemple. Le surcoût lié à la prise en charge du changement de tâche n'en vaut pas toujours la peine.

4
Jeff