Dans le domaine informatique, un processus parent (Anglais : Parent Process) fait référence à un processus qui a créé un ou plusieurs processus enfants.
Sous UNIX, sauf pour processus 0 (c'est-à-dire PID =0 processus d'échange, tous les processus sauf Swapper Process) sont créés par d'autres processus à l'aide de l'appel système fork. Le processus qui appelle fork pour créer un nouveau processus ici est le processus parent et le processus créé correspondant. est un processus enfant, donc les processus autres que le processus 0 n'ont qu'un seul processus parent, mais un processus peut avoir plusieurs processus enfants.
Le noyau du système d'exploitation identifie un processus avec un identifiant de processus (Process Identifier, c'est-à-dire PID). Le processus 0 est un processus spécial créé lorsque le système démarre. Après avoir appelé fork pour créer un processus enfant (c'est-à-dire le processus 1 avec PID=1, également appelé init), le processus 0 devient un processus d'échange (parfois également appelé ). Processus inactif) et le processus 1 (processus d'initialisation) est l'ancêtre de tous les autres processus du système.
Lorsqu'un processus enfant termine son exécution (appelant généralement exit, une erreur fatale se produit pendant l'exécution, ou Lorsqu'un signal de fin est reçu), l'état de sortie (valeur de retour) du processus enfant sera signalé au système d'exploitation et le système utilisera le signal SIGCHLD pour notifier le processus parent de la fin du processus enfant à. cette fois, le bloc de contrôle de processus (PCB) du processus enfant) réside toujours en mémoire. D'une manière générale, après avoir reçu SIGCHLD, le processus parent utilisera l'appel système d'attente pour obtenir l'état de sortie du processus enfant, puis le noyau pourra libérer le PCB du processus enfant terminé de la mémoire si le processus parent ne le fait pas ; , le processus enfant Le PCB du processus résidera toujours dans la mémoire, ce qui signifie qu'il devient un processus zombie.
Un processus orphelin fait référence à un processus enfant qui est toujours en cours d'exécution après la fin du processus parent. Dans les systèmes de type UNIX, les processus orphelins sont généralement « adoptés » par le processus init et deviennent les processus enfants d'init.
Afin d'éviter les processus zombies, l'approche généralement adoptée dans les applications pratiques est la suivante :
Définissez la fonction de traitement du signal SIGCHLD dans le processus parent sur SIG_IGN (ignorez le signal ) ;
fourchez deux fois et tuez le processus enfant de premier niveau, faisant du processus enfant de deuxième niveau un processus orphelin et "adopté" et nettoyé par init.
Dans le noyau Linux, il y a une très légère différence entre un processus et un thread POSIX, et la définition d'un parent Le processus est également différent de celui d'UNIX. Linux a deux types de processus parents, à savoir le processus parent (formel) et le processus parent réel. Pour un processus enfant, son processus parent est le processus qui reçoit le signal SIGCHLD à la fin du processus enfant, et le processus parent réel est le processus qui. reçoit le signal SIGCHLD à la fin du processus enfant. Processus qui crée réellement le processus enfant dans l'environnement du thread. Pour un processus normal, le processus parent et le processus parent réel sont le même processus, mais pour un thread POSIX qui existe sous la forme d'un processus, le processus parent et le processus parent réel peuvent être différents.
Dans le domaine informatique, un processus enfant est créé par un autre processus (appelé en conséquence le processus parent) créé processus. Le processus enfant hérite de la plupart des attributs du processus parent, tels que les descripteurs de fichiers.
Sous Unix, les processus enfants sont généralement le produit d'un appel système fork
. Dans ce cas, le processus enfant est une copie du processus parent au début, et après cela, selon des besoins spécifiques, le processus enfant peut utiliser l'appel exec à charger en chaîne un autre programme A.
Un processus peut avoir plusieurs processus enfants, mais il ne peut y en avoir qu'un au plus Processus parent, et si un processus n'a pas de processus parent, on peut voir que le processus est susceptible d'être directement généré par le noyau. Dans les systèmes Unix et de type Unix, le processus avec l'ID de processus 1 (c'est-à-dire le processus d'initialisation) est directement créé par le noyau pendant la phase de démarrage du système et ne terminera pas l'exécution pendant l'exécution du système (voir Processus de démarrage Linux) ; d'autres processus qui n'ont pas de processus parent, ils peuvent être exécutés pour effectuer diverses tâches en arrière-plan dans l'espace utilisateur.
Lorsqu'un processus enfant se termine, est interrompu ou reprend son exécution, le noyau enverra le signal SIGCHLD à son processus parent. Par défaut, le processus parent l'ignorera avec la fonction SIG_IGN.
Une fois l'exécution du processus parent correspondant terminée, le processus deviendra un processus orphelin, mais il le fera immédiatement "adopté" par le processus init en tant que processus enfant.
Une fois l'exécution d'un processus enfant terminée, si son processus parent n'appelle pas wait
à l'avance, le noyau continuera à conserver l'état de sortie et d'autres informations du processus enfant afin que le processus parent puisse wait
obtenez-le. Et parce que dans ce cas, même si le processus enfant a été arrêté, il consomme toujours des ressources système, c'est pourquoi on l'appelle également un processus zombie. attendre est souvent appelé dans la fonction de traitement du signal SIGCHLD.
Dans la norme POSIX.1-2001, le processus parent peut définir la fonction de traitement SIGCHLD sur SIG_IGN (également le paramètre par défaut) ou sur SIGCHLD Définir le Indicateur SA_NOCLDWAIT afin que le noyau puisse récupérer automatiquement les ressources des processus enfants terminés. Depuis Linux 2.6 et FreeBSD 5.0, les deux noyaux prennent en charge ces deux méthodes. Cependant, lorsqu'il s'agit d'ignorer le signal SIGCHLD, en raison des différences de longue date entre System V et BSD, l'appel de wait
reste le moyen le plus pratique de recycler les ressources du processus enfant dérivé.
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!