Qui s'exécute en premier, après le fork(): le parent ou l'enfant?
Je sais qu'il peut être l'un de ces. Mais je vois toujours que l'enfant s'exécute en premier sur mon terminal UNIX. Aussi, pourquoi ne pas le parent et l'enfant d'exécuter en parallèle. Ils semblent être en cours d'exécution en série. Est-ce parce qu'ils partagent le même terminal?
- double possible de la commande de l'exécution de fork() est-elle déterminée?
- Enfant sur Linux, non précisée d'une manière générale POSIX plate-forme.
Vous devez vous connecter pour publier un commentaire.
En général, rien ne peut être dit à propos de l'ordre relatif de leur exécution.
Maintenant, considérons votre problème spécifique. Si:
Probablement cela indique qu'il existe certains (peut-être involontaire) de synchronisation entre les deux processus.
top
devrait vous donner une idée de savoir si les deux processus sont en cours d'exécution "en parallèle".En réalité, c'est le comportement voulu, même si elle n'est pas actuellement fonctionne comme il se doit, ce qui signifie que le parent peut s'exécuter avant que l'enfant et l'enfant peut s'exécuter avant que le parent.
Le but est de gérer le processus de l'enfant en premier.
En bref, la logique derrière cela est que si l'enfant est couru d'abord, la surcharge de copie sur écriture (la VACHE) est éliminé si l'enfant est d'appeler
exec
depuis le parent n'a aucune chance d'écrire à l'adresse de l'espace.Si vous appelez vfork alors presque toutes les implémentations de définir que l'enfant sera exécuté en premier et ensuite parent va s'exécuter.(Jusqu'enfant demande exec).Donc, vous remarquerez l'exécution de série en cas de vfork indépendamment de schedular.Cependant, quand une fourche est simplement appelé deux nouveaux processus sont créés.Ils sont libres de fonctionner de façon indépendante.(Juste comme tout autre processus). Le processus qui s'exécute en premier sera fortement dépendante de l'algorithme d'ordonnancement. Côté algorithme d'ordonnancement le nombre de processus en cours d'exécution à ce moment permettra également de déterminer la nature de la production.D'ailleurs si vous êtes en utilisant le standard de la bibliothèque de fonctions d'e/s les données de sortie en rafales(sans doute pas le bon mot). Qui permettra également de déterminer dans une certaine mesure, qui se met à écrire en premier. Voici un exemple de code(Qui n'a pas beaucoup de sens pratiquement, mais encore un bon exemple de le parent et l'enfant à effet de fonctionner en synchronisme
Pour mon système, la sortie suivante vient
Toutefois, si de réduire le nombre de fourchettes à deux(Seulement deux processus concurrents), alors la sortie est moins moche.Son le parent qui s'exécute en premier.(Probablement à cause de ses processus en cours d'exécution lorsque l'autre processus est créé)
Il n'est pas vraiment une exécution avant l'autre. C'est simplement que le parent
fork()
puiswait()
pour l'enfant à effectuer. Il peut même fourchette plusieurs fois si vous utilisez un réseau série de commandes par exemple.Que les autres réponses, vous ne pouvez pas le savoir, et vous ne devriez pas compter sur elle.
Mais, historiquement, sur Linux, parent contiune à exécuter, et après cela, les enfants. Sur un ancien Noyau Linux, il a été mis en œuvre le contraire manière: exécutant rapidement les enfants, qui seront probablement appel à un
exec
. De cette manière il n'y aura pas de copie sur écriture de la mémoire (ce qui devrait être fait à chaque écriture de parent). Devinez quoi? Que les changements cassé de nombreux outils de manière subtile (et difficile à déboguer), de sorte qu'il a été repris. Une perte de l'optimisation!.Donc pas de relais sur le processus qui sera exécuté en premier.