ce qui est réentrante noyau
4 réponses
Réponse beaucoup plus simple:
Noyau De Re-Entrée
Si le noyau n'est pas réentrant, un processus ne peut être suspendu que lorsqu'il est en mode utilisateur. Bien qu'il puisse être suspendu en mode noyau, cela bloquerait toujours l'exécution en mode noyau sur tous les autres processus. La raison en est que tous les threads du noyau partagent la même mémoire. Si l'exécution sautait arbitrairement entre eux, la corruption pourrait se produire.
Un noyau ré-entrant active les processus (ou, pour être plus précis, leurs fils de noyau correspondants) pour donner le CPU en mode noyau. Ils n'empêchent pas les autres processus d'entrer également en mode noyau. Un cas d'utilisation typique est io wait. Le processus a envie de lire un fichier. Il appelle une fonction du noyau pour cela. Dans la fonction du noyau, le contrôleur de disque est demandé pour les données. Obtenir les données prendra un certain temps et la fonction est bloquée pendant ce temps. Avec un noyau ré-entrant, le planificateur affectera le processeur à un autre processus (noyau thread) jusqu'à une interruption du contrôleur de disque indique que les données sont disponibles et notre fil peuvent être repris. Ce processus peut toujours accéder aux E / S (ce qui nécessite des fonctions du noyau), comme l'entrée de l'utilisateur. Le système reste réactif et les pertes de temps CPU dues à l'attente D'E / S sont réduites.
C'est à peu près standard pour les systèmes d'exploitation de bureau d'aujourd'hui.
Préemption du noyau
La préemption du noyau n'aide pas dans le débit global du système. Au lieu de cela, il cherche pour une meilleure réactivité.
L'idée ici est que normalement les fonctions du noyau ne sont interrompues que par des causes matérielles: soit des interruptions externes, soit des cas D'attente D'E / S, où elles donnent volontairement le contrôle au planificateur. Un noyau préemptif interrompt et suspend également les fonctions du noyau, tout comme il interromprait les processus en mode utilisateur. Le système est plus réactif, car les processus, par exemple la manipulation de l'entrée de la souris, sont réveillés même lorsque le travail lourd est effectué à l'intérieur du noyau.
La préemption au niveau du noyau rend les choses plus difficiles pour le développeur du noyau: la fonction du noyau ne peut pas être suspendue seulement volontairement ou par des gestionnaires d'interruption (qui sont un peu un environnement contrôlé), mais aussi par tout autre processus dû au planificateur. Il faut prendre soin, par exemple, d'éviter les blocages: un thread verrouille la ressource a mais ayant besoin de la ressource B est interrompu par un autre thread qui verrouille la ressource B, mais a besoin de la ressource A.
Prenez mon explication de préemption avec un grain de sel. je suis heureux pour toutes les corrections.
Tous les noyaux Unix sont réentrants.{[2] } cela signifie que plusieurs processus peuvent s'exécuter en mode noyau en même temps. Bien sûr, sur les systèmes monoprocesseurs, un seul processus peut progresser, mais beaucoup peuvent être bloqués en mode noyau en attendant le CPU ou l'achèvement d'une opération d'E/S. Par exemple, après avoir émis une lecture sur un disque pour le compte d'un processus, le noyau laisse le contrôleur de disque le gérer et reprend l'exécution d'autres processus. Une interruption avertit le noyau quand l'appareil satisfait à la lecture, de sorte que l'ancien processus peut reprendre l'exécution.
Une façon de fournir la réentrance est d'écrire des fonctions afin qu'elles ne modifient que les variables locales et ne modifient pas les structures de données globales. De telles fonctions sont appelées fonctions réentrantes . Mais un noyau réentrant n'est pas limité à de telles fonctions réentrantes (bien que c'est ainsi que certains noyaux en temps réel sont implémentés). Au lieu de cela, le noyau peut inclure des fonctions non réentrantes et utiliser des mécanismes de verrouillage pour assurez - vous qu'un seul processus peut exécuter une fonction non réentrante à la fois.
Si une interruption matérielle se produit, un noyau réentrant peut suspendre le processus en cours même si ce processus est en mode noyau. Cette capacité est très importante, car elle améliore le débit des contrôleurs de périphériques qui émettent des interruptions. Une fois qu'un périphérique a émis une interruption, il attend que le processeur le reconnaisse. Si le noyau est capable de répondre rapidement, le contrôleur de périphérique sera capable pour effectuer d'autres tâches pendant que le PROCESSEUR gère l'interrompre.
Regardons maintenant la réentrance du noyau et son impact sur l'organisation du noyau. Un chemin de contrôle du noyau indique la séquence d'instructions exécutées par le noyau pour gérer un appel système, une exception ou une interruption.
Dans le cas le plus simple, le processeur exécute un chemin de contrôle du noyau séquentiellement de la première instruction à la dernière. Cependant, lorsque l'un des événements suivants se produit, le processeur entrelace le chemins de contrôle du noyau:
Un processus s'exécutant en mode utilisateur appelle un appel système, et le chemin de contrôle du noyau correspondant vérifie que la requête ne peut pas être satisfaite immédiatement; il appelle ensuite le planificateur pour sélectionner un nouveau processus à exécuter. En conséquence, un commutateur de processus se produit. Le premier chemin de contrôle du noyau est laissé inachevé, et le processeur reprend l'exécution d'un autre chemin de contrôle du noyau. Dans ce cas, les deux chemins de contrôle sont exécutés pour le compte de deux processus.
Le processeur détecte une exception-par exemple, l'accès à une page Non présente dans la RAM-lors de l'exécution d'un chemin de contrôle du noyau. Le premier chemin de contrôle est suspendu et la CPU commence l'exécution d'une procédure appropriée. Dans notre exemple, ce type de procédure peut allouer une nouvelle page pour le processus et lire son contenu à partir du disque. Lorsque la procédure se termine, le premier chemin de contrôle peut être repris. Dans ce cas, les deux chemins de contrôle sont exécutés pour le compte du même processus.
Une interruption matérielle se produit pendant que le processeur exécute un chemin de contrôle du noyau avec les interruptions activées. Le premier chemin de contrôle du noyau est laissé inachevé, et le processeur commence à traiter un autre chemin de contrôle du noyau pour gérer l'interruption. Le premier chemin de contrôle du noyau reprend lorsque le gestionnaire d'interruption se termine. Dans ce cas, les deux chemins de contrôle du noyau s'exécutent dans le contexte d'exécution du même processus, et le temps CPU total du système lui est comptabilisé. Cependant, l' le gestionnaire d'interruption ne fonctionne pas nécessairement pour le compte du processus.
Une interruption se produit alors que le processeur est en cours d'exécution avec la préemption du noyau activée, et un processus de priorité plus élevée est exécutable. Dans ce cas, le premier chemin de contrôle du noyau est laissé inachevé, et le processeur reprend l'exécution d'un autre chemin de contrôle du noyau pour le compte du processus de priorité supérieure. Cela se produit uniquement si le noyau a été compilé avec la prise en charge de la préemption du noyau.
Ces informations sont disponibles sur http://jno.glas.net/data/prog_books/lin_kern_2.6/0596005652/understandlk-CHP-1-SECT-6.html
Plus Sur http://linux.omnipotent.net/article.php?article_id=12496&page=-1
Le noyau est la partie centrale d'un système d'exploitation qui s'interface directement avec le matériel et les annexes le processus à exécuter.
Les processusAppellent les fonctions du noyau pour effectuer des tâches telles que l'accès au matériel ou le démarrage de nouveaux processus. Par conséquent, pendant certaines périodes, un processus exécutera du code du noyau. Un noyau est appelé reentrant si plusieurs processus peuvent exécuter du code du noyau en même temps. "En même temps" peut signifier soit que deux processus exécutent en fait du code du noyau simultanément (sur un système multiprocesseur) ou qu'un processus a été interrompu pendant l'exécution du code du noyau (parce qu'il attend que le matériel réponde, par exemple) et qu'un autre processus programmé pour s'Exécuter a également appelé dans le noyau.
Un noyau réentrant offre de meilleures performances car il n'y a pas de contention pour le noyau. Un noyau qui n'est pas réentrant doit utiliser un verrou pour assurez - vous qu'aucun processus n'exécute le code du noyau en même temps.
Une fonction réentrante est une fonction qui peut être utilisée par plusieurs tâches simultanément sans crainte de corruption de données. Inversement, une fonction non réentrante est une fonction qui ne peut pas être partagée par Plus d'une tâche à moins que l'exclusion mutuelle de la fonction ne soit assurée soit en utilisant un sémaphore, soit en désactivant les interruptions pendant les sections critiques du code. Une fonction réentrante peut être interrompue à tout moment et reprise ultérieurement sans perte de données. Les fonctions réentrantes utilisent soit des variables locales ou protéger leurs données lorsque des variables globales sont utilisées.
Une fonction réentrante:
Does not hold static data over successive calls
Does not return a pointer to static data; all data is provided by the caller of the function
Uses local data or ensures protection of global data by making a local copy of it
Must not call any non-reentrant functions