Maison > Article > Tutoriel système > Explorer le changement de contexte sur les processeurs Linux
Comme nous le savons tous, Linux est un système d'exploitation qui prend en charge le multitâche. Le nombre de tâches qu'il peut exécuter en même temps dépasse de loin le nombre de processeurs. Bien entendu, ces tâches ne s'exécutent pas réellement en même temps (pour un seul processeur), mais parce que le système alloue le processeur à ces tâches à tour de rôle pendant une courte période de temps, créant l'illusion de plusieurs tâches exécutées en même temps. .
Avant l'exécution de chaque tâche, le processeur doit savoir où charger et démarrer cette tâche. Cela signifie que le système doit configurer à l'avance les registres et le compteur de programme du processeur.
Les registres CPU sont des mémoires petites mais très rapides intégrées au CPU. Le compteur de programme est utilisé pour stocker l'emplacement de l'instruction en cours d'exécution par le CPU ou l'emplacement de la prochaine instruction à exécuter.
Ces deux éléments constituent l'environnement nécessaire au processeur avant qu'il puisse effectuer une tâche, c'est pourquoi on l'appelle "contexte CPU". Veuillez vous référer à l'image ci-dessous :
Maintenant que vous savez ce qu'est le contexte CPU, je pense qu'il vous sera facile de comprendre le Changement de contexte CPU. Le « changement de contexte CPU » fait référence à la sauvegarde du contexte CPU (registres CPU et compteur de programme) de la tâche précédente, puis au chargement du contexte de la nouvelle tâche dans ces registres et compteur de programme, et enfin au passage au compteur de programme.
Ces contextes enregistrés sont stockés dans le noyau du système et rechargés lorsque l'exécution de la tâche est reprogrammée. Cela garantit que l'état d'origine de la tâche n'est pas affecté et que la tâche semble s'exécuter en continu.
Vous pourriez dire que la commutation de contexte du processeur n'est rien d'autre que la mise à jour des registres du processeur et des valeurs des compteurs de programme, et ces registres sont conçus pour exécuter des tâches rapidement, alors pourquoi cela affecte-t-il les performances du processeur ?
Avant de répondre à cette question, avez-vous déjà réfléchi à ce que sont ces « tâches » ? On pourrait dire qu'une tâche est un processus ou un thread. Oui, les processus et les threads sont les tâches les plus courantes, mais il existe d’autres types de tâches en plus.
N'oubliez pasL'interruption matérielle est également une tâche courante. Le signal de déclenchement matériel entraînera l'appel du gestionnaire d'interruption.
Par conséquent, il existe au moins trois types différents de commutateurs de contexte CPU :
Jetons un coup d’œil un par un.
Linux divise l'espace d'exécution du processus en espace noyau et espace utilisateur en fonction du niveau de privilège, qui correspond au niveau de privilège CPU de Ring 0
和 Ring 3
dans la figure ci-dessous.
Ring 0
) dispose des autorisations les plus élevées et peut accéder directement à toutes les ressourcesRing 3
) ne peut accéder qu'à des ressources restreintes et ne peut pas accéder directement aux périphériques matériels tels que la mémoire. Il doit être piégédans le noyau via des appels systèmeafin d'accéder à ces ressources privilégiées. En regardant les choses sous un autre angle, un processus peut s'exécuter à la fois dans l'espace utilisateur et dans l'espace noyau. Lorsqu'un processus s'exécute dans espace utilisateur, on l'appelle état utilisateur du processus. Lorsqu'il tombe dans espace noyau, on l'appelle état noyau du processus.
La conversion du mode utilisateur au mode noyau doit être effectuée via appel système. Par exemple, lorsque nous visualisons le contenu d'un fichier, nous avons besoin de l'appel système suivant :
open()
: Ouvrir le dossier read()
: Lire le contenu du fichierwrite()
: Écrivez le contenu du fichier dans le fichier de sortie (y compris la sortie standard) close()
: Fermer le dossier Alors, le changement de contexte du processeur se produira-t-il pendant l'appel système ci-dessus ? bien sûr.
Cela nécessite d'abord d'enregistrer l'emplacement de l'instruction du mode utilisateur d'origine dans le registre du processeur. Ensuite, afin d'exécuter du code en mode noyau, les registres du processeur doivent être mis à jour vers le nouvel emplacement des instructions en mode noyau. Enfin, passez à l'état du noyau pour exécuter la tâche du noyau.
Ensuite, une fois l'appel système terminé, les registres du processeur doivent restaurerl'état utilisateur enregistré d'origine, puis passer à l'espace utilisateur pour continuer à exécuter le processus.
Ainsi, lors d'un appel système, il y a en fait deux commutateurs de contexte CPU.
Mais il convient de souligner que le processus d'appel système n'impliquera pas de changement de processus, ni de changement de ressources système telles que la mémoire virtuelle. Ceci est différent de ce que nous appelons habituellement le « changement de contexte de processus ». Le changement de contexte de processus fait référence au passage d'un processus à un autre, alors que le même processus est toujours en cours d'exécution pendant l'appel système
Le processus d'appel système est souvent appelé commutateur de mode privilège, plutôt que commutateur de contexte. Mais en fait, pendant le processus d'appel système, le changement de contexte CPU est également inévitable.
Alors, quelle est la différence entre le changement de contexte de processus et les appels système ? Tout d'abord, les processus sont gérés par le noyau et la commutation de processus ne peut se produire qu'en mode noyau. Par conséquent, le contexte du processus inclut non seulement les ressources de l'espace utilisateur telles que la mémoire virtuelle, la pile et les variables globales, mais inclut également les états de l'espace du noyau tels que la pile du noyau et les registres.
Donc, le changement de contexte de processus comporte une étape de plus que l'appel système :
Avant de sauvegarder l'état du noyau et les registres du processeur du processus en cours, vous devez sauvegarder la mémoire virtuelle, la pile, etc. du processus et charger l'état du noyau du processus suivant ;
Selon le rapport de test de Tsuna, chaque changement de contexte nécessite des dizaines de nanosecondes à des microsecondes de temps CPU. Ce temps est considérable, en particulier dans le cas d'un grand nombre de changements de contexte de processus, ce qui peut facilement amener le processeur à consacrer beaucoup de temps à économiser et à restaurer des ressources telles que les registres, les piles de noyau et la mémoire virtuelle. C’est exactement ce dont nous avons parlé dans le dernier article, un facteur important qui fait augmenter la charge moyenne.
Alors, quand le processus sera-t-il planifié/commuté pour s'exécuter sur le CPU ? En fait, il existe de nombreux scénarios, laissez-moi vous les résumer ci-dessous :
sleep
, il sera naturellement reprogrammé.
Lorsqu'un processus avec une priorité plus élevée est en cours d'exécution, afin d'assurer le fonctionnement du processus à haute priorité, le processus en cours sera suspendu par le processus à haute prioritéChangement de contexte de fil de discussion
l'acquisition des ressources. Pour parler franchement, la soi-disant planification des tâches dans le noyau planifie en fait les threads ; et les processus ne fournissent que des ressources telles que la mémoire virtuelle et les variables globales pour les threads. Ainsi, pour les threads et les processus, nous pouvons le comprendre de cette façon :
Lorsqu'un processus n'a qu'un seul thread, on peut considérer qu'un processus est égal à un thread
Tout d’abord, les deux threads avant et après appartiennent à des processus différents. À l'heure actuelle, puisque les ressources ne sont pas partagées, le processus de commutation est le même que le changement de contexte de processus.
Changement de contexte d'interruption
Afin de répondre rapidement aux événements, les interruptions matérielles interrompront le processus normal de planification et d'exécution, puis appelleront le gestionnaire d'interruption
.Lors de l'interruption d'autres processus, l'état actuel du processus doit être enregistré afin que le processus puisse toujours être restauré à partir de son état d'origine après l'interruption.
Contrairement au contexte de processus, le changement de contexte d'interruption n'implique pas l'état utilisateur du processus. Par conséquent, même si le processus d'interruption interrompt le processus en mode utilisateur, il n'est pas nécessaire de sauvegarder et de restaurer les ressources du mode utilisateur telles que la mémoire virtuelle et les variables globales du processus.De plus, comme la commutation de contexte de processus, la commutation de contexte d'interruption consomme également du CPU. Des temps de commutation excessifs consommeront beaucoup de ressources CPU et réduiront même considérablement les performances globales du système. Par conséquent, lorsque vous constatez qu'il y a trop d'interruptions, vous devez faire attention à vérifier si cela entraînera de graves problèmes de performances pour votre système.
Conclusion
Cependant, un changement de contexte excessif consommera du temps CPU pour sauvegarder et restaurer des données telles que les registres, les piles de noyau, la mémoire virtuelle, etc., raccourcissant ainsi le temps d'exécution réel du processus et entraînant une diminution significative des performances globales du système.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!