Quelle est la commande de création de processus Linux ?

青灯夜游
Libérer: 2023-03-13 09:58:58
original
3343 Les gens l'ont consulté

Commandes de création de processus Linux : 1. La commande fork peut créer un nouveau processus à partir d'un processus existant. Le nouveau processus est un processus enfant, et le processus d'origine est le processus parent ; . 2. Avec la commande vfork, le processus enfant créé partage l'espace d'adressage avec le processus parent, ce qui signifie que le processus enfant s'exécute entièrement dans l'espace d'adressage du processus parent. 3. La commande clone peut copier sélectivement les ressources du processus parent vers le processus enfant, et les structures de données qui ne sont pas copiées sont partagées par le processus enfant via la copie de pointeur.

Quelle est la commande de création de processus Linux ?

L'environnement d'exploitation de ce tutoriel : système linux7.3, ordinateur Dell G3.

Il existe trois commandes disponibles pour créer un processus dans le système Linux : fork, vfork et clone.

fork

Lorsque fork crée un processus, le processus enfant copie uniquement complètement les ressources du processus parent. Le processus enfant copié a sa propre structure task_struct et son pid, mais il copie toutes les autres ressources du processus parent. Par exemple, si le processus parent a cinq fichiers ouverts, alors le processus enfant a également cinq fichiers ouverts et les pointeurs de lecture et d'écriture actuels de ces fichiers sont également arrêtés au même endroit. Donc, cette étape fait, c'est copier. Le processus enfant ainsi obtenu est indépendant du processus parent et a une bonne concurrence. Cependant, la communication entre les deux nécessite des mécanismes de communication spéciaux, tels qu'un canal, une mémoire partagée et d'autres mécanismes, pour créer un processus enfant via fork. , vous devez utiliser la description ci-dessus. Faites une copie de chaque ressource. De ce point de vue, fork est un appel système très coûteux. Ces surcharges ne sont pas nécessaires dans tous les cas. Par exemple, après qu'un processus ait fork un processus enfant, son processus enfant doit simplement appeler exec pour exécuter un autre fichier exécutable. la copie de l'espace mémoire virtuelle pendant le processus de fork sera un processus redondant. Mais comme Linux adopte désormais la technologie de copie sur écriture (COW copy-on-write), afin de réduire les frais généraux, fork ne produira pas réellement deux copies différentes au départ, car à ce moment-là, une grande quantité de données est en fait complètement identique. . La copie sur écriture diffère la copie réelle des données. Si l'écriture se produit plus tard, cela signifie que les données du parent et de l'enfant sont incohérentes, donc une action de copie se produit et chaque processus obtient sa propre copie, ce qui peut réduire la surcharge des appels système. Ainsi, avec la copie sur écriture, l'implémentation de vfork n'a que peu d'importance.

 L'appel fork() renvoie deux valeurs une fois exécuté. Pour le processus parent, la fonction fork renvoie le numéro de processus du sous-programme, tandis que pour le sous-programme, la fonction fork renvoie zéro. deux fois.

 Après le fork, le processus enfant et le processus parent continueront à exécuter les instructions après l'appel du fork. Le processus enfant est une copie du processus parent. Il obtiendra une copie de l'espace de données, du tas et de la pile du processus parent. Ce sont des copies. Les processus parent et enfant ne partagent pas cette partie de la mémoire. En d'autres termes, la modification d'une variable de même nom dans le processus parent par le processus enfant n'affectera pas sa valeur dans le processus parent. Mais les processus père-fils partagent quelque chose, qui est simplement la section texte du programme. Le segment de texte stocke les instructions machine exécutées par le processeur et est généralement en lecture seule.

vfork

L'appel système vfork est différent de fork. Le processus enfant créé avec vfork partage l'espace d'adressage avec le processus parent. Si le processus enfant modifie quelque chose à ce moment-là, variable, cela affectera le processus parent.

Par conséquent, si vfork() est utilisé dans l'exemple ci-dessus, les valeurs de a et b imprimées deux fois seront les mêmes et les adresses seront les mêmes.

Mais une chose à noter ici est que le processus enfant créé avec vfork() doit être terminé en appelant exit(), sinon le processus enfant ne pourra pas se terminer, et cette situation n'existe pas avec fork().

 Vfork renvoie également le numéro de processus du processus enfant dans le processus parent et renvoie 0 dans le processus enfant.

 Après avoir utilisé vfork pour créer un processus enfant, le processus parent sera bloqué jusqu'à ce que le processus enfant appelle exec (exec, charge un nouveau fichier exécutable dans l'espace d'adressage et l'exécute.) ou quitte. L'avantage de vfork est qu'après la création du processus enfant, il suffit souvent d'appeler exec pour exécuter un autre programme, car il n'aura aucune référence à l'espace d'adressage du processus parent, donc la copie de l'espace d'adressage est redondante. , il est donc partagé via vfork. La mémoire peut réduire les frais généraux inutiles.

clone

  Les appels système fork() et vfork() n'ont aucun paramètre, tandis que clone() a des paramètres. fork() consiste à tout copier, vfork() consiste à partager la mémoire et clone() peut copier sélectivement les ressources du processus parent vers le processus enfant, et la structure de données qui n'est pas copiée est partagée par le processus enfant via la copie de pointeur. Plus précisément, les ressources à copier sur le processus enfant sont déterminées par clone_flags dans la liste des paramètres. De plus, clone() renvoie le pid du processus enfant.

En savoir plus sur la commande fork (création de processus) ci-dessous.

Au cœur de la fonction fork

La fonction fork est une fonction très importante sous Linux, elle crée un nouveau processus à partir d'un processus existant. Le nouveau processus est le processus enfant et le processus d'origine est le processus parent.

La valeur de retour de la fonction fork :

  • Renvoyer le pid du processus enfant au processus parent
  • Renvoyer 0 au processus enfant

Ensuite, utilisons la fonction fork () comme exemple

Quelle est la commande de création de processus Linux ?

Compilons-la et exécutons-la :

Quelle est la commande de création de processus Linux ?

Utilisation générale de fork

  • Un processus parent veut se copier afin que les processus parent et enfant exécutent différents segments de code en même temps. Par exemple, un processus parent attend une demande client et génère un processus enfant pour gérer la demande.
  • Un processus veut exécuter un programme différent. Par exemple, une fois que le processus enfant revient de fork, il appelle la fonction exec.

La raison pour laquelle l'appel fork a échoué

  • Il y a trop de processus dans le système
  • Le nombre de processus utilisateur réels dépasse la limite

Après avoir examiné l'utilisation de la fonction fork, ensuite Nous étudions un sujet :

fork() crée un processus enfant. Quelles opérations le système d'exploitation effectue-t-il ?

Le processus appelle fork. Lorsque le contrôle est transféré au code fork dans le noyau, le noyau effectue les opérations suivantes :

  • Alloue de nouveaux blocs de mémoire et structures de données du noyau au processus enfant.

  • Copiez le contenu de la structure de données du processus parent vers le processus enfant.

  • Ajoutez le processus enfant à la liste des processus système.

  • fork revient et démarre la planification du planificateur.

Quelle est la commande de création de processus Linux ?

Une fois que le processus parent a exécuté le code avant fork (avant), il appelle fork pour créer un processus enfant, et les deux flux d'exécution du père et de l'enfant sont exécutés séparément. Remarque : Après fork, qui l'exécute en premier est entièrement décidé par le planificateur.

Il y a une autre question ici. Lorsque le code est partagé entre les processus parent et enfant après le fork, est-il partagé après, ou tout le code est-il partagé Pourquoi le processus enfant exécute-t-il toujours le code correspondant après le fork ? avec précision?

Réponse : tout le code est partagé car le processeur garde une trace de l'endroit où le processus s'exécute.

  • Une fois le code assemblé, il y aura de nombreuses lignes de code, et chaque ligne de code aura une adresse correspondante après son chargement dans la mémoire.
  • Étant donné que le processus peut être interrompu à tout moment (peut ne pas être terminé), la prochaine fois qu'il continuera à s'exécuter, il devra continuer à partir de la position précédente (pas du début du programme ou de la fonction principale), ce qui nécessite le CPU pour enregistrer en temps réel le lieu d'exécution actuel du processus.
  • Ainsi, il existe des données de registre correspondantes dans la CPU, qui sont utilisées pour enregistrer la position d'exécution du processus en cours. Ce registre est appelé EIP, également connu sous le nom de PC (compteur de programme à code point), qui est utilisé pour enregistrer l'adresse. de la prochaine ligne de code en cours d'exécution (données contextuelles).
  • Lorsqu'un processus enfant est créé, son EIP sera modifié. A ce moment, le processus enfant pensera que les données enregistrées dans l'EIP sont le code à exécuter.

Lorsqu'un processus enfant est créé, le système d'exploitation alloue la structure de données correspondante au processus enfant, et le processus enfant s'exécute indépendamment car le processus est indépendant.

Théoriquement, le processus enfant devrait également avoir son propre code et ses propres données, mais d'une manière générale, il n'y a pas de processus de chargement lors de la création d'un processus enfant, et le processus enfant lui-même n'a pas son propre code et ses propres données.

Ainsi, le processus enfant ne peut « utiliser » que le code et les données du processus parent, et le code est en lecture seule, et le partage parent-enfant n'entrera pas en conflit ; tandis que les données peuvent être modifiées et doivent être séparées.

À ce stade, le système d'exploitation adopte la stratégie de copie sur écriture.

Copie sur écriture

3-Quelle est la commande de création de processus Linux ?

Pourquoi le système d'exploitation utilise-t-il la technologie de copie sur écriture pour séparer les processus parents et enfants

  • La copie pendant l'écriture est une manifestation d'une utilisation efficace de la mémoire.

  • Améliore l'efficacité de fonctionnement du système.

  • Le système d'exploitation ne peut pas prédire quels espaces seront accessibles avant l'exécution du code.

Connaissances approfondies : terminaison du processus et

Terminaison du processus

Lorsque le processus se termine, le système d'exploitation libère les structures de données du noyau pertinentes et les données de code correspondantes appliquées par le processus. release Ressources système,

1. Code de sortie du processus

Moyens courants de terminaison du processus :

  1. Une fois le code exécuté, le résultat est correct.
  2. Le code est exécuté et le résultat est incorrect.
  3. Le code n'a pas fini de s'exécuter et le programme s'est écrasé.

Pour distinguer le premier cas du deuxième cas, on peut le distinguer clairement grâce au code de sortie du processus.

À propos de la valeur de retour de la fonction principale dans le langage C appris, où la valeur de retour de la fonction principale est le code de sortie du processus. Son sens est de revenir au processus de niveau supérieur pour évaluer les résultats d'exécution du processus.

Maintenant, nous écrivons un programme C simple.

Quelle est la commande de création de processus Linux ?

Ensuite, nous pouvons obtenir le code de sortie du dernier processus via echo $?

Quelle est la commande de création de processus Linux ?La valeur de retour d'un processus a deux situations : 0 et non-0. 0 signifie que le programme s'exécute avec succès et que le résultat est correct, et non-0 signifie que le programme s'exécute avec succès mais que le résultat est incorrect. Il existe d'innombrables valeurs non nulles et différentes valeurs non nulles. La valeur peut représenter différentes erreurs, nous permettant de définir la cause de l'erreur.

Quels sont les messages d'erreur courants ?

Nous pouvons utiliser strerror pour l'imprimer

Quelle est la commande de création de processus Linux ? Les résultats sont les suivants :

Quelle est la commande de création de processus Linux ?

Quelle est la commande de création de processus Linux ? Nous avons constaté qu'il y a 133 codes d'erreur sous Linux

当然,程序崩溃的时候,退出码没有意义。 Comme nous le savons tous, Linux utilise le langage C écrit, l'essence de la commande est un programme en langage C, on peut donc simplement prendre la commande ls comme exemple

Quelle est la commande de création de processus Linux ? et le message d'erreur correspondant au code de sortie n°2 :

Quelle est la commande de création de processus Linux ?

2. exit et _exit

À propos de la terminaison Un processus peut utiliser l'instruction return, et peut également appeler les fonctions exit et _exit

exit function :

1Quelle est la commande de création de processus Linux ? _exit function :

1Quelle est la commande de création de processus Linux ? Il y en a beaucoup différences entre ces deux fonctions. Donnons d'abord un petit exemple :

Nous utilisons ensuite printf pour imprimer un message, puis dormons pendant trois secondes, puis utilisons exit pour quitter et observons les résultats

1Quelle est la commande de création de processus Linux ? Parce que nous avons apporté n, l'ajout de n actualisera le tampon et notre impression apparaîtra sur le contenu de l'écran.

1Quelle est la commande de création de processus Linux ? Si on n'apporte pas n, on observe le résultat :

1Quelle est la commande de création de processus Linux ? On constate que : parce qu'il n'y a pas de n, le contenu de printf n'est pas imprimé avant de dormir, mais le tampon est transféré après appelant exit Le contenu est actualisé et affiché à l'écran.

Ensuite, nous utilisons la fonction _exit

1Quelle est la commande de création de processus Linux ? pour exécuter le fichier exécutable b :

1Quelle est la commande de création de processus Linux ? et constatons que rien n'est imprimé. Utilisez echo $ pour imprimer le code de sortie du processus récent et constatez que le fichier b est imprimé. effectivement exécuté.

Cela montre que exit est une fonction de bibliothèque et _exit est un appel système, qui n'actualise pas le contenu du tampon lors de la sortie du processus.

1Quelle est la commande de création de processus Linux ? À ce stade, nous pouvons tirer une conclusion :

les données printf sont stockées dans le "buffer", exit peut les rafraîchir, mais l'interface d'appel système _exit ne peut pas les rafraîchir. Par conséquent, le tampon ne doit pas être à l’intérieur du système d’exploitation, mais maintenu par la bibliothèque standard C.

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!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!