Contrôle de cinq processus Linux

2 Concepts liés au
processus 2.1 Programme et processus
 Programme fait référence au fichier binaire compilé, qui occupe de l'espace disque sur le disque, et est un concept statique 
Processus, un programme démarré, qui occupe des ressources système, telles que : Mémoire physique, CPU, terminal, etc. sont un concept dynamique
Programme → scénario (papier)
Processus → jeu (scène, acteurs, éclairage, accessoires...)
Le même scénario peut être mis en scène sur plusieurs scènes en même temps. De même, le même programme peut également être chargé en tant que processus différents (sans s'affecter les uns les autres)
2.2 Parallélisme et simultanéité
 La simultanéité signifie exécuter plusieurs programmes simultanément sur le même processeur dans un laps de temps.
Par exemple : Si le temps 1S du CPU est divisé en 1000 tranches de temps, chaque processus doit renoncer inconditionnellement au droit d'utiliser le CPU après avoir exécuté une tranche de temps, afin que 1000 processus puissent être exécutés en 1S.

Parallélisme signifie que deux ou plusieurs programmes se produisent en même temps (nécessite plusieurs).

2.3 Bloc de contrôle de processus PCB
Chaque processus a un bloc de contrôle de processus (PCB) dans le noyau pour maintenir les informations liées au processus.Le bloc de contrôle de processus du noyau Linux est une structure task_struct.
À la ligne 1390 du fichier /usr/src/linux-headers-4.4.0-96/include/linux/sched.h, vous pouvez voir la définition de la structure struct task_struct. Il existe de nombreux membres internes, nous pouvons nous concentrer sur les parties suivantes :
Process id. Chaque processus du système a un identifiant unique, représenté par le type pid_t en langage C, qui est en fait un entier non négatif.
L'état du processus, y compris prêt, en cours d'exécution, suspendu, arrêté, etc.
Certains registres CPU qui doivent être sauvegardés et restaurés lors de la commutation de processus.
 Décrire les informations de l'espace d'adressage virtuel.
 Décrire les informations du terminal de contrôle.
Répertoire de travail actuel.
getcwd --pwd
masque de masque.
Le tableau des descripteurs de fichier contient de nombreux pointeurs vers la structure du fichier.
 Informations relatives au signal.
 ID utilisateur et ID de groupe.
Groupe de session et de processus.
La limite de ressources que le processus peut utiliser (Resource Limit).
ulimit -a
2.4 Statut du processus (test d'entretien)
 Il existe 5 statuts de base du processus. Il s'agit de l'état initial, de l'état prêt, de l'état de fonctionnement, de l'état suspendu et de l'état terminé. Parmi eux, l'état initial est l'étape de préparation du processus, qui est souvent considérée en combinaison avec l'état prêt.

3 Créer un processus
3.1 fonction fork
Fonction : Créer un processus enfant
Prototype : pid_t fork(void);
Paramètres de la fonction : Aucun
Valeur de retour : Appel réussi : le processus parent renvoie le PID du processus enfant et le processus enfant renvoie 0 ;
échec de l'appel : retour - 1. Définissez la valeur errno.
● Exemple d'extrait de code de fonction de fourche

Le principe d'implémentation du noyau d'appeler la fonction fork :

● Résumé de la fonction fork
►Quelle est la valeur de retour de la fonction fork ?
Le processus parent renvoie le PID du processus fils, qui est un nombre supérieur à 0 ;
le processus fils renvoie 0 ;
en particulier, ce n'est pas la fonction fork qui renvoie 2 valeurs dans un processus, mais renvoie une valeur dans chacune des processus père et enfant.
►Une fois le processus enfant créé avec succès, où le code est-il exécuté ?
Là où le processus parent est exécuté, le processus enfant sera exécuté d'où
►Comment faire la distinction entre les processus parent et enfant
Via la valeur de retour de la fonction fork
►L'ordre d'exécution des processus parent et enfant
n'est pas nécessairement, quel que soit le processus qui saisit le CPU en premier, quel que soit le processus qui exécute en premier
la commande 3.2 ps et tue la commande
ps aux | grep « xxx »
ps ajx | grep « xxx »
-a : (tous) les processus de tous les utilisateurs du système actuel
-u : afficher propriétaire du processus et quelques autres informations
-x : afficher aucun terminal de contrôle Processus - processus qui ne peuvent pas interagir avec les utilisateurs [entrée, sortie]
-j : lister les informations relatives au contrôle des tâches
kill -l Afficher les signaux que le système a
kill - 9 pid Tue un thread
3.3 getpid/getppid
getpid - récupère le PID du processus courant
pid_t getpid(void);
getppid - récupère le PID du processus parent du processus courant
pid_t getppid(void);
3.3 Exercices
Écrivez un programme pour créer plusieurs sous-processus en boucle. Les exigences sont les suivantes :
1. Plusieurs sous-processus sont frères.
2. Déterminez quel sous-processus est le sous-processus
Dessinez une image pour expliquer les problèmes rencontrés lors de la création de plusieurs sous-processus
Remarque : Si plusieurs sous-processus sont des processus frères, les sous-processus ne doivent pas être autorisés à créer de nouveaux sous-processus processus.
Écrivez un programme pour tester si les processus parent et enfant peuvent partager des variables globales
Concentrez-vous sur le partage en lecture et copie sur écriture à travers ce cas
4 famille de fonctions exec
4.1 Présentation des fonctions et des fonctions
Parfois, il est nécessaire d'exécuter d'autres commandes dans un processus ou un utilisateur -defined Le programme d'application défini utilise actuellement les fonctions de la famille de fonctions exec.
La méthode d'utilisation consiste généralement à appeler fork dans le processus parent pour créer un processus enfant, puis à appeler la fonction exec dans le processus enfant.
fonction execl
Prototype de la fonction : int execl(const char *path, const char arg, … / (char *) NULL */);
introduction paramètre :
path : le chemin absolu du programme à exécuter
variable paramètre arg : le programme à exécuter Paramètres requis par le programme
arg : espace réservé, écrivez généralement le nom de l'application
arg : les paramètres de la commande après l'
écriture des paramètres :
valeur de retour NULL : si elle réussit, elle ne retournera pas, et n'exécutera pas le code de fonction exec suivant ; s'il échoue, le code derrière execl sera exécuté et la cause de l'erreur peut être imprimée avec perror.
La fonction execl exécute généralement le programme écrit par elle-même.

fonction execlp
Prototype de la fonction : int execlp(const char *file, const char arg, …/ (char *) NULL */);
introduction paramètre :
file : le nom de la commande à exécuter, rechercher la commande selon la variable d'environnement PATH
arg : Espace réservé
 Arg derrière : Paramètres de la commande
 Après l'écriture des paramètres : NULL
Valeur de retour : Si elle réussit, elle ne retournera pas, et le code derrière la fonction exec ne sera pas exécuté ; si elle échoue, le code derrière l'exec sera exécuté, qui peut être utilisé perror imprime la raison de l'erreur.
La fonction execlp exécute généralement le programme ou la commande fourni avec le système
4.2 Le principe de la famille de fonctions exec introduit
le schéma de principe de réalisation de la fonction de la famille exec :
tel que : execlp(“ls”, “ls”, “-l ", NUL);

Résumé :
La fonction exec remplace le segment de code, le segment de données, le tas et la pile du processus actuel par un nouveau programme ; l'espace de processus d'origine n'a pas changé, aucun nouveau processus n'a été créé et le PID du processus n'a pas changé.
4.3 Exercice de la fonction exec
Utilisez la fonction execl pour exécuter un programme d'application défini par l'utilisateur
Utilisez la fonction execlp pour exécuter une commande système Linux

Remarque : lorsque les fonctions execl et execlp sont exécutées avec succès, elles ne sont pas renvoyées et la logique de code sous-jacente à execl n'est pas exécutée. La raison en est qu'après l'appel réussi de la fonction execl, le segment de code spécifié par la fonction exec a remplacé le segment de code d'origine.
5 Recyclage des processus
5.1 Pourquoi avons-nous besoin de recycler les ressources du processus ?
Lorsqu'un processus se termine, le processus peut récupérer ses propres ressources de la zone utilisateur, mais ne peut pas récupérer les ressources PCB dans l'espace du noyau. Il doit appeler la fonction wait ou waitpid par son parent processus pour terminer le processus. Le recyclage du processus évite le gaspillage des ressources du système.
5.2 Processus orphelin
 Le concept de processus orphelin :
Si le processus parent du processus enfant est mort, mais que le processus enfant est toujours actif, le processus devient un processus orphelin.
Afin de s'assurer que chaque processus a un processus parent, le processus orphelin sera adopté par le processus init, et le processus init devient le processus parent adoptif du processus orphelin. Après la sortie du processus orphelin, le processus init termine le recyclage du processus orphelin.
Le cas de la simulation d'un processus orphelin
Écrivez le code pour simuler un processus orphelin, expliquez le processus orphelin et vérifiez si le processus parent du processus orphelin est passé du processus parent d'origine au processus init.
5.3 Processus zombie
 Le concept de processus zombie :
Si le processus enfant est mort et que le processus parent est toujours actif, mais que le processus parent n'appelle pas la fonction wait ou waitpid pour terminer le recyclage du processus enfant, le processus enfant devient un processus zombie.
Comment résoudre le processus zombie
Puisque le processus zombie est un processus mort, il ne peut pas être tué avec la commande kill
Le processus zombie peut être éliminé en tuant son processus parent.
Après avoir tué son processus parent, le processus zombie sera adopté par le processus init, et le processus init terminera le recyclage du processus zombie.
Le cas de la simulation d'un processus zombie
Écrivez du code qui simule un processus zombie pour expliquer le processus zombie, vérifiez que si le processus enfant se termine avant le processus parent et que le processus parent n'appelle pas la fonction wait ou waitpid pour recycler, le processus enfant devient un processus zombie. fonction de récupération fonction d'attente Prototype
de la fonction : pid_t wait(int *status); Fonction : Bloquer et attendre la sortie du sous-processus Recycler les ressources résiduelles du sous-processus Obtenir l'état final du sous-processus processus (motif de sortie). Valeur de retour : Succès : ID du processus fils qui a été nettoyé ; Échec : -1 (pas de processus fils) Paramètre d'état : état de sortie du processus fils - paramètre sortant WIFEXITED(état) : non-0 → le processus se termine normalement WEXITSTATUS(status) : Obtenir le statut de sortie du processus WIFSIGNALED(status) : non-0 → le processus se termine anormalement WTERMSIG(status) : Obtenir le numéro de signal de la fin du processus. exercice sur la fonction wait Utilisez la fonction wait pour terminer le recyclage du processus parent vers le processus fils fonction waitpid Prototype de la fonction : pid_t waitpid (pid_t pid, int * status , in options ) ;

























pid = -1 attend tout processus enfant. Équivalent à attendre.
pid > 0 Attend un processus enfant dont l'ID de processus est égal à pid.
pid = 0 Attend tout processus enfant avec le même ID de groupe de processus que le processus actuel, c'est-à-dire tout
processus dans le même groupe de processus que le processus qui a appelé waitpid().
pid < -1 attend tout processus enfant dont l'ID de groupe est égal à la valeur absolue de pid. (Applicable au cas où le processus enfant est dans d'autres groupes)
status : Le statut de sortie du processus enfant, l'utilisation est la même que la fonction d'attente.
options : réglé sur WNOHANG, la fonction est non bloquante, réglé sur 0, la fonction est bloquante.
 Valeur de retour de la fonction

0 : renvoie l'ID du processus enfant recyclé ;
-1 : aucun processus enfant
= 0 : reportez-vous à 3 pour WNOHANG et le processus enfant est en cours d'exécution.
Exercice sur la fonction waitpid
Utilisez la fonction waitpid pour terminer la récupération du processus enfant

Guess you like

Origin blog.csdn.net/qq_30505673/article/details/131927238