Sous Linux, le contexte est également appelé contexte CPU. Il s'agit de l'environnement sur lequel le CPU doit s'appuyer avant d'exécuter une tâche, y compris les registres CPU et les compteurs de programme ; la commutation de contexte consiste à modifier d'abord le contexte CPU de la tâche précédente (c'est-à-dire , registres CPU et compteur de programme), puis chargez le contexte de la nouvelle tâche dans ces registres et le compteur de programme, et enfin sautez vers le nouvel emplacement indiqué par le compteur de programme pour exécuter la nouvelle tâche.
L'environnement d'exploitation de ce tutoriel : système linux7.3, ordinateur Dell G3.
Linux est un système d'exploitation multitâche. Il prend en charge des tâches bien plus importantes que le nombre de processeurs à exécuter en même temps. Bien sûr, ces tâches ne s'exécutent pas en même temps, mais le système. Le CPU leur est alloué à tour de rôle, donnant à l'utilisateur l'illusion que de nombreuses tâches s'exécutent simultanément.
Avant l'exécution de chaque tâche, le processeur doit savoir où la tâche est chargée et où elle commence à s'exécuter. En d'autres termes, le système doit configurer à l'avance le registre du processeur et le compteur de programme (compteur de programme, PC) : il s'agit d'une mémoire de petite capacité mais extrêmement rapide intégrée au compteur de programme du processeur : elle est utilisée pour. stocker l'emplacement de l'instruction en cours d'exécution par le CPU, ou l'emplacement de la prochaine instruction à exécuter
En résumé, nous avons la réponse
Le contexte que nous On parle généralement de contexte CPU. Il s'agit de l'environnement sur lequel le CPU doit s'appuyer avant d'exécuter une tâche, y compris les registres CPU et les compteurs de programme. tâche précédente (c'est-à-dire les registres CPU et le compteur de programme), puis chargez le contexte de la nouvelle tâche dans ces registres et ce compteur de programme, et enfin sautez vers le nouvel emplacement indiqué par le compteur de programme pour exécuter la nouvelle tâche.
2. Introduction détaillée au changement de contexte
changement de contexte de processus
, changement de contexte de thread code> <span class="md-plain">, <code>Changement de contexte d'interruption
Comprenons d'abord les deux points de connaissance suivants impliqués dans le changement de contexteAppel système, état d'exécution du processus
Linux divise l'espace d'exécution du processus en espace noyau
进程上下文切换
、线程上下文切换
、中断上下文切换
我们先了解下面2个上下文切换涉及的知识点系统调用、进程运行态
进程的运行态:
Linux 按照特权等级,把进程的运行空间分为内核空间
和用户空间
。在这两种空间中运行的进程状态分别称为内核态
和用户态
。
内核空间(Ring 0):具有最高权限,可以直接访问所有资源(读取文件,)
分配内存、IO操作、创建子进程……都是内核操作。这也表明,当IO操作频繁时,System参数会很高。
用户空间(Ring 3):只能访问受限资源,不能直接访问内存等硬件设备,必须通过系统调用进入到内核中,才能访问这些特权资源
典型的用户态空间程序有:Shells、数据库、web服务器、PHP程序、Java程序……
在linux系统使用top命令查看cpu时,能看到user和system两项,对应的就是用户态和内核态占用的cpu资源
如上,我们的web服务是运行在用户态
et espace utilisateur
selon le niveau de privilège. Les états de processus exécutés dans ces deux espaces sont appelés respectivement état du noyau
et état utilisateur
.
🎜Espace noyau (Ring 0) : possède les autorisations les plus élevées et peut accéder directement à toutes les ressources (lire des fichiers,) 🎜🎜🎜🎜🎜🎜Allouer de la mémoire, des opérations d'E/S, créer des processus enfants... all C'est une opération du noyau. Cela montre également que lorsque les opérations d'E/S sont fréquentes, les paramètres système seront très élevés. 🎜🎜🎜🎜🎜🎜🎜🎜Espace utilisateur (Ring 3) : ne peut accéder qu'à des ressources restreintes, ne peut pas accéder directement aux périphériques matériels tels que la mémoire et doit entrer dans le noyau via des appels système pour accéder à ces ressources privilégiées🎜🎜🎜🎜🎜🎜 Typique Les programmes de l'espace utilisateur incluent : Shells, bases de données, serveurs Web, programmes PHP, programmes Java...🎜🎜🎜🎜🎜🎜🎜🎜Lorsque vous utilisez la commande top pour afficher le processeur dans le système Linux, vous pouvez voir l'utilisateur et le système. éléments, qui correspondent aux ressources CPU occupées par le mode utilisateur et le mode noyau🎜🎜🎜🎜Comme ci-dessus, notre service Web fonctionne en
mode utilisateur
🎜, et n'a pas l'autorisation pour l'io de le fichier. Lorsque le fichier doit être lu, cela implique un 🎜appel système🎜🎜🎜🎜🎜🎜🎜🎜Appel système : 🎜🎜La transition du mode utilisateur au mode noyau doit être effectuée via des appels système. Par exemple, lors de la visualisation d'un fichier, plusieurs appels système doivent être exécutés : ouvrir, lire, écrire, fermer, etc. Le processus de l'appel système est le suivant :
Enregistrez l'emplacement d'origine des instructions en mode utilisateur dans le registre CPU ;
Afin d'exécuter le code du noyau, le registre CPU doit être mis à jour ; vers le nouvel emplacement de l'instruction en mode noyau, et enfin passez au mode noyau pour exécuter les tâches du noyau
Une fois l'appel système terminé, les registres du processeur doivent être restaurés au mode utilisateur initialement enregistré, et puis passez à l'espace utilisateur pour continuer à exécuter le processus ;
Donc, une fois le système Le processus appelant implique en fait deux changements de contexte CPU.
Lorsque l'exécution du processus se termine, le processeur qu'il utilisait précédemment sera libéré, puis le processus suivant en attente de la tranche de temps sera retiré de la file d'attente prête ; Lorsque la tranche de temps est épuisée, elle sera suspendue par le système et passera à d'autres processus en attendant que le CPU s'exécute
Un certain processus sera suspendu car il nécessite des ressources système relativement importantes (telles qu'une mémoire insuffisante ; ). Suspendre, le système planifiera l'exécution d'autres processus ;
Lorsqu'un processus avec une priorité plus élevée (processus d'exploitation du système) a besoin d'une tranche de temps, afin de garantir que le processus avec une priorité plus élevée puisse être exécuté ; , le processus en cours sera suspendu ;
S'il y a une fonction de veille dans le processus en cours, elle sera également suspendue ;
Changement de contexte des threads ?
Lorsque le processus n'a qu'un seul thread, le processus peut être considéré comme égal au fil.
Lorsqu'un processus a plusieurs threads, ces threads partageront les ressources du processus parent (c'est-à-dire partageront les mêmes ressources telles que la mémoire virtuelle et les variables globales). Ces ressources n'ont pas besoin d'être modifiées lors du changement de contexte.
De plus, les threads ont également leurs propres données privées, telles que des piles et des registres, qui doivent également être enregistrées lors du changement de contexte.
Pour résumer, il existe deux situations de changement de contexte de thread :
Les deux threads avant et après appartiennent à des processus différents. Parce que les ressources ne sont pas partagées, le processus de changement est le même que le processus. changement de contexte ;
Les deux threads avant et après appartiennent au même processus, car la mémoire virtuelle est partagée, donc lors du changement, les ressources de mémoire virtuelle restent inchangées, et seules les données privées, registres et autres non du thread -les données partagées doivent être commutées.
Interruption du changement de contexte ?
Résumé Selon le rapport de test de Tsuna, chaque changement de contexte nécessite des dizaines de nanosecondes à plusieurs microsecondes de temps CPU, ce qui est assez considérable. Peu importe le scénario qui provoque le changement de contexte, vous devez savoir : Le changement de contexte du processeur est l'une des fonctions essentielles pour assurer le fonctionnement normal du système Linux. Généralement, nous n'avons pas besoin de payer de frais spéciaux. attention à cela. 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 et la mémoire virtuelle, raccourcissant ainsi le temps d'exécution réel du processus et provoquant une baisse significative des performances globales de le système. Recommandations associées : "Tutoriel vidéo Linux"
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!