Le noyau prend le contrôle assez fréquemment dans les opérations normales :chaque fois qu'un processus appelle un appel système et chaque fois qu'une interruption se produit. Les interruptions se produisent lorsque le matériel demande l'attention du CPU, ou lorsque le CPU veut l'attention du noyau, et un élément matériel particulier peut être programmé pour demander l'attention périodiquement (la minuterie). Ainsi, le noyau peut s'assurer que, tant que le système ne se bloque pas si fort qu'aucune interruption n'est plus générée, il sera invoqué périodiquement.
En conséquence,
si ce processus effectue des calculs extrêmement longs sans céder
n'est pas un problème :Linux est un système d'exploitation multitâche préemptif, c'est-à-dire il est multitâche sans nécessiter la coopération des programmes en cours d'exécution.
Lorsqu'il s'agit de tuer des processus, le noyau est de toute façon impliqué. Si un processus veut tuer un autre processus, il doit appeler le noyau pour le faire, ainsi le noyau est en contrôle. Si le noyau décide de tuer un processus (par exemple le tueur de MOO, ou parce que le processus a essayé de faire quelque chose qu'il n'est pas autorisé à faire, comme accéder à de la mémoire non mappée), il est également sous contrôle.
Notez que le noyau peut être configuré pour ne pas contrôler un sous-ensemble des processeurs d'un système lui-même (en utilisant le isolcpus
obsolète paramètre kernel), ou de ne pas planifier lui-même des tâches sur certains CPU (en utilisant des cpusets sans répartition de charge, qui sont entièrement intégrés dans cgroup v1 et cgroup v2) ; mais au moins un processeur du système doit toujours être entièrement géré par le noyau. Il peut également être configuré pour réduire le nombre d'interruptions de minuterie générées, en fonction de l'utilisation d'un processeur donné.
Il n'y a pas non plus beaucoup de distinction entre les systèmes à processeur unique (single-core, etc.) et les systèmes à plusieurs processeurs, les mêmes préoccupations s'appliquent aux deux en ce qui concerne le contrôle du noyau :chaque processeur doit appeler périodiquement le noyau s'il est à utiliser pour le multitâche sous le contrôle du noyau.
Linux et la plupart des systèmes d'exploitation modernes utilisent le multitâche préemptif, ce qui signifie que le noyau a un contrôle total sur la durée d'exécution de chaque processus et préemptera un processus s'il s'exécute trop longtemps, contrairement au multitâche coopératif où un processus passe le contrôle quand il le souhaite. P>
Fondamentalement, dans le multitâche préemptif, le noyau sera déclenché périodiquement à partir d'une minuterie, et chaque fois que le noyau est en contrôle (lorsque l'interruption de la minuterie se produit ou qu'un appel système est invoqué), le noyau enregistre le contexte du processus en cours, puis passe au processus suivant. ' le contexte. C'est ce qu'on appelle un changement de contexte où tout l'état du processus, y compris toutes les informations de thread, les valeurs de registre ... sont enregistrés et restaurés pour que le processus continue à s'exécuter à partir du point exact où il a été anticipé sans même savoir qu'il n'a pas été exécuté en continu. Par conséquent, de nombreux processus apparaîtront pour s'exécuter simultanément dans un seul cœur de processeur, même si en réalité un seul processus est exécuté à tout moment. Le noyau est également juste un processus spécial qui gère tout le processus et les ressources. Il n'est pas exécuté à partir d'un noyau séparé juste pour surveiller d'autres processus
Voir aussi Que veut dire "le noyau Linux est préemptif" ?