Ce que veut dire le “noyau linux est préemptif”?
J'ai lu que le noyau Linux est préemptif, 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 des exemples de mieux que de pur explication théorique.
AJOUTER 1 -- 11:00 AM 12/7/2018
De préemption est juste un paradigme de multi-tâches. Il existe d'autres comme Coopérative Multi-tâches. Une meilleure compréhension peuvent être obtenus en les comparant.
Vous devez vous connecter pour publier un commentaire.
Imaginer la simple vue de la souscription des multi-tâches. Nous avons deux tâches des utilisateurs, qui sont tous deux en marche tout le temps sans utiliser de I/O ou de l'exécution du noyau appels. Ces deux tâches n'avez pas à faire quelque chose de spécial pour être en mesure d'exécuter sur un système d'exploitation multitâches. Le noyau, qui est généralement basée sur une minuterie d'interruption, il suffit décide qu'il est temps pour une tâche à la pause de laisser un autre terme. La tâche en question est totalement inconscient que tout ce qui s'est passé.
Cependant, la plupart des tâches de faire des demandes du noyau via des appels. Lorsque cela se produit, le même contexte de l'utilisateur existe, mais le CPU est en cours d'exécution du code sur le nom de la tâche.
Anciens noyaux Linux ne permettrait jamais à la préemption d'une tâche alors qu'il était occupé à l'exécution de code du noyau. (Notez que les opérations d'e/S toujours volontairement re-programmer. Je parle d'un cas où le code du noyau a de l'UC-fonctionnement intensif telles que le tri de la liste.)
Si le système permet à cette tâche de préemption de alors qu'il est en cours d'exécution de code noyau, alors nous avons ce qu'on appelle un "noyau préemptif." Un tel système est à l'abri des retards imprévisibles qui peuvent être rencontrées au cours d'appels, de sorte qu'il pourrait être mieux adapté pour les systèmes embarqués ou les tâches temps-réel.
Par exemple, si sur un PROCESSEUR en particulier il y a deux tâches disponibles, et l'on prend un syscall qui prend 5ms complète, et l'autre est un lecteur MP3 application qui a besoin de se nourrir de l'audio tuyau de toutes les 2ms, vous entendrez peut-être des coupures de son.
L'argument à l'encontre de préemption est que tout le code du noyau qui peut être appelé dans la tâche contexte doit être en mesure de survivre, de préemption, il y a beaucoup de pauvres pilote de périphérique de code, par exemple, qui pourrait être mieux si il est toujours en mesure de terminer l'opération avant de permettre à une autre tâche à 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 ré-entrant, pour que l'argument n'est pas aussi pertinents aujourd'hui.) En outre, si le même objectif pourrait être satisfaite par l'amélioration de la syscalls avec le mauvais temps de latence, peut-être la préemption est inutile.
Un compromis est CONFIG_PREEMPT_VOLUNTARY, ce qui permet une tâche-interrupteur à certains points à l'intérieur du noyau, mais pas partout. S'il y a seulement un petit nombre d'endroits où le code du noyau peut s'enliser, c'est un moyen peu coûteux de réduire les temps d'attente tout en gardant la complexité gérable.
Avant le noyau Linux version 2.5.4, le Noyau Linux n'a pas été de préemption qui signifie un processus en cours d'exécution en mode noyau ne peut pas être déplacé hors de processeur jusqu'à ce qu'elle quitte le processeur ou il commence en attente pour certains d'entrée et de sortie pour obtenir terminée.
Généralement un processus en mode utilisateur puisse entrer en mode noyau à l'aide des appels système. Auparavant, lorsque le noyau est non préemptif, une priorité inférieure processus pourrait priorité inverser une priorité élevée processus en lui refusant l'accès au processeur à plusieurs reprises par l'appel des appels système et en restant dans le mode noyau. Même si la priorité la plus basse du processus de timeslice expiré, il serait continuer à fonctionner jusqu'à ce qu'il a terminé son travail dans le noyau ou volontairement renoncé au contrôle. Si la priorité élevée processus en attente d'être exécuté est un éditeur de texte dans lequel l'utilisateur est en train de taper ou d'un lecteur MP3, prêt à remplir son tampon audio, le résultat est médiocre performance interactive. De cette façon, non préemptif noyau a un inconvénient majeur à l'époque.
Traditionnel des noyaux unix avait un verrou unique, qui s'est tenue par un fil alors que le code du noyau a été en cours d'exécution. Par conséquent, aucun autre code du noyau pourrait interrompre le thread.
Ce fait la conception du noyau plus facile, puisque vous saviez que si un thread à l'aide de ressources du noyau, aucun autre thread a été. C'est pourquoi les différents threads ne peuvent pas gâcher le travail de chacun.
Dans les systèmes monoprocesseur cela ne cause pas trop de problèmes.
Cependant, dans les systèmes multiprocesseurs, vous pourriez avoir une situation où plusieurs threads sur différents processeurs ou cœurs de tous les voulait exécuter du code en même temps. Cela signifie que selon le type de charge de travail, vous pourriez avoir beaucoup de processeurs, mais tous passent la plupart de leur temps à attendre les uns les autres.
Dans Linux 2.6, le noyau de ressources ont été divisées en petites unités, protégés par des verrous individuels, et le code du noyau a été revue afin d'assurer que les verrous ont eu lieu alors que les ressources correspondantes ont été en cours d'utilisation. 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 l'IMPRESSION de parallélisme: vous avez un seul processeur (disons il y a une décennie), mais vous vous sentez comme tous vos processus en cours d'exécution fronts simultanément. C'est parce que le noyau prévaut (c'est à dire, prendre de l'exécution de l'exécution d'un processus à donner à la prochaine (peut-être en fonction de leur priorité).
MODIFIER Pas de souscription des noyaux d'attente pour les processus de redonner la main (c'est à dire, pendant les syscalls), donc si votre processus calcule un grand nombre de données et ne pas appeler n'importe quel type de
yield
fonction, les autres processus ne sera pas en mesure d'exécuter pour exécuter leurs appels. De tels systèmes sont dits coopérative car ils demandent la collaboration du processus pour assurer l'équité du temps d'exécutionEDIT 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, tandis que de l'autre main, les serveurs voulez atteindre le plus haut througput, de sorte qu'ils n'en ont pas besoin: (à partir de la configuration du noyau Linux)
Cela signifie que le planificateur du système d'exploitation est libre de suspendre l'exécution du processus en cours d'exécution pour donner le traitement à un autre processus chaque fois qu'il le veut; la façon normale de faire, c'est de donner à chaque processus qui est en attente pour le CPU un "quantum" de temps PROCESSEUR à exécuter. Après il a expiré le programmateur reprend le contrôle (et les processus en cours d'exécution ne peut pas éviter cela) pour donner un autre quantique à un autre processus.
Cette méthode est souvent comparé avec le multitâche coopératif, dans lequel les processus de garder le CPU pour tout le temps dont ils ont besoin, sans être interrompu, et de laisser à d'autres applications, il faut appeler explicitement une sorte de "rendement" de la fonction; naturellement, pour éviter de donner le sentiment du système d'être coincé, bien éduqués applications donnera le CPU souvent. Encore,si il y a un bug dans une application (par exemple, une boucle infinie sans rendement des appels), l'ensemble du système se bloque, puisque le PROCESSEUR est complètement conservé par le mauvais programme.
Presque tous les Os de bureau utilisation multitâche préemptif, qui, même si elle est plus coûteuse en termes de ressources, est en général plus stable (il est plus difficile pour un sigle défectueux app pour accrocher l'ensemble du système, depuis l'OS est toujours dans la commande). 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 est une coopérative OS multitâche; un exemple plus récent peut être RockBox, une opensource PMP firmware de remplacement.
Le noyau linux est monolithique, et de donner un peu de calcul de temps de tous les processus en cours d'exécution de façon séquentielle. Cela signifie que le processus (par exemple. les programmes) ne pas exécuter simultanément, mais ils sont donnés donner un laps de temps régulièrement pour l'exécution de leur logique. Le principal problème est que la logique peut prendre plus de temps pour mettre fin et prévenir le noyau pour permettre à temps pour le prochain processus. Cette résultats dans le système "gal".
Un preemtive noyau a la capacité de changer de contexte. Cela signifie qu'il peut arrêter un "accrochage" du processus, même si ce n'est pas fini, et donner le temps de calcul pour le prochain processus comme prévu. La "pendaison" processus continuera à exécuter quand son temps est venu sans aucun problème.
Pratiquement, cela signifie que le noyau a la capacité de réaliser des tâches en temps réel, ce qui est particulièrement intéressant pour l'enregistrement et d'édition audio.
La ubuntu studio districution paquets de préemption du noyau ainsi que d'un buch de la qualité du logiciel libre dédié à l'audio et de la vidéo de l'édition.
Je pense que tout le monde a fait un bon travail d'expliquer cela, mais je vais juste ajouter un peu plus d'infos. dans le contexte de Linux IRQ, l'interruption et l'ordonnancement de noyau.
Process scheduler est le composant du système d'exploitation qui est responsable de décider si en cours d'emploi/processus doit continuer à exécuter et si pas le processus qui doit s'exécuter suivant.
de préemption planificateur de est un planificateur qui permet d'être interrompu et un processus en cours d'exécution alors peut changer son état, puis laisser un autre processus à exécuter (depuis le courant a été interrompu).
D'autre part, non préemptif planificateur ne peut pas enlever le CPU à l'écart à partir d'un processus (aka coopérative)
Pour info, le nom du mot "coopérative" peut être source de confusion parce que la signification du mot n'indique pas clairement ce que le planificateur de la réalité.
Âgées, par exemple, Windows 3.1 avait coopérative les planificateurs.
Pleine de crédit de merveilleux l'article ici
Je pense que c'est devenu de préemption de 2.6. de préemption signifie que lorsqu'un nouveau processus est prêt à être exécuté, le cpu sera alloué à ce nouveau processus, il n'a pas besoin de l'exécution d'un processus coopératif et les ressources du processeur.
Noyau Linux est préemptif signifie que Le noyau prend en charge la préemption.
Par exemple, il y a deux processus P1(priorité élevée) et P2(faible priorité) qui sont en train de faire lire des appels système et ils sont en cours d'exécution en mode noyau. Supposons que P2 est en cours d'exécution et est dans le mode noyau et P2 est planifiée pour s'exécuter.
Si le noyau de préemption est disponible, alors la préemption peut se produire au niveau du noyau, j'.e P2 pouvez obtenir éliminé, et qu'mais pour le sommeil et la P1 peut continuer à s'exécuter.
Si le noyau de préemption n'est pas disponible puisque P2 est en mode noyau, le système attend simplement jusqu'à P2 est terminée, puis