11
votes

Pourquoi Fork and Exec est conservé 2 appels distincts

Je comprends les différences entre la fourchette, VFORK, EXEC, ExecV, Execp. Donc, les pls ne rant pas à ce sujet. Ma question concerne la conception de la création de processus UNIX. Pourquoi les concepteurs ont-ils pensé de créer 2 appels séparés (Fourche et Exec) au lieu de le garder un appel serré (Spawn). Était une bonne conception de l'API une raison pour que les développeurs avaient plus de contrôle sur la création de processus? Est-ce en raison de la raison de la performance, de sorte que nous puissions retarder l'allocation de la table de processus et d'autres structures de noyau à l'enfant jusqu'à la copie-écriture ou la copie-sur-accès?


3 commentaires

Comment simuleriez-vous Fork en utilisant SPAWN ?


Je ne peux pas simuler la fourche en utilisant SPAWN...ploies une combinaison de fourchette et d'exécutant.


@Let_me_be Pourquoi auriez-vous besoin de la fourchette du tout?


5 Réponses :


4
votes

Fork et EXEC font des choses complètement différentes.

  • Fourchette () - Duplicats Un processus
  • EXEC () - remplace un processus

    Il y a beaucoup de raisons d'utiliser un sans l'autre. Vous pouvez faire une fourchette des processus enfants qui effectuent des tâches pour le compte de votre application mère contrôlante parent., Jolie courante dans le monde UNIX. Et vous pouvez par exemple Configurez les conditions préalables pour une autre application bizarre, puis l'exécutez à partir de votre application de lanceur sans jamais utiliser Fork.


3 commentaires

Ou même une utilisation plus commune de la plaine EXEC , redémarrez votre application (par exemple, les démons de réseau sont-ils si elles détectent une nouvelle version de leur binaire et sont inactives).


N'est-il pas vrai que SPAWN appel système pourrait être mis en œuvre plus efficacement que Fork + Exec ? Pour moi, il ressemble à spawn n'aurait pas besoin de copier du segment de données en tant que fourchette.


@ Sasha.Sochka Today (et en 2014 également) Les systèmes modernes utilisent copie-write pour Fourche 'Ed Processes.



0
votes

afaik, initialement il n'y avait que Fork (). Mais des raisons de performance appelées à la création d'EXED () qui ne créent pas les structures de noyau qui vont être immédiatement écrasées. <- c'est faux.

Il y a un problème de performance lorsqu'un processus a besoin de CO créer un processus enfant qui n'est pas une copie de lui-même. Une fourchette () copie des données de noyau liées au processus qui vont être immédiatement remplacées par un EXED (). Ainsi, VFORK () a été introduit qui ne copie pas de données excessives de noyau et de données de processus; Après cela, un processus devrait appeler quelque chose d'EXED () - comme et que le parent est suspendu jusqu'à ce que l'enfant le fasse. Voir la section «Bugs» pour la description des problèmes avec VFORK (), cependant.


1 commentaires

Si cela est vrai, comment les gens ont-ils démarré des programmes sans EXEC ?



-2
votes

Fourchette () ne peut être utilisée que pour la création d'un processus d'enfant. La réplication de la mère peut être effectuée. Pendant que EXEC () puisse être utilisé pour démarrer tout nouveau processus sur le système. Je ne vois aucune corrélation supérieure à deux.


1 commentaires

Je pense que la question se pose car Windows n'a pas Fork ou EXEC , mais seulement une combinaison d'entre eux (dans UNIX PARLANCE, Fourche directement suivi de < code> exec ).



9
votes

La principale raison est probable que la séparation de la fourchette Fourchette () et EXEC () Les étapes permettent une configuration arbitraire de l'environnement enfant à effectuer à l'aide d'autres appels système. Par exemple, vous pouvez:

  • Configurez un ensemble arbitraire de descripteurs de fichiers ouverts;
  • modifier le masque de signal;
  • Définissez le répertoire de travail actuel;
  • Définissez le groupe de processus et / ou la session;
  • Définissez les groupes utilisateur, groupe et supplémentaire;
  • Définir des limites de ressources rigides et douces;

    ... et beaucoup plus d'ailleurs. Si vous alliez combiner ces appels dans un seul Spawn () appel, il faudrait avoir une interface très complexe, pour pouvoir encoder toutes ces modifications possibles à l'environnement de l'enfant - et si vous Vous avez déjà ajouté un nouveau paramètre, l'interface devrait être modifiée. D'autre part, distinct Fork () et exécuté () Les étapes vous permettent d'utiliser les appels système ordinaires ( Ouvrir () , fermer () , DUP () , fcntl () , ...) Pour manipuler l'environnement de l'enfant avant le EXEC () < / code>. Nouvelle fonctionnalité (par exemple, Capset () ) est facilement supporté.


4 commentaires

À Gould, lorsque je travaillais sur un Unix en temps réel, j'ai conçu [*] un appel système (en fait, la famille de celle-ci) qui a permis de combiner la fourchette et exécutée, c'est-à-dire qui vous a permis d'éviter les frais généraux de la première fourche, clonant votre processus actuel, puis substituant une image de processus différente via EXEC - sans Kluge VFORK. // Bot Contrairement à Posix Spawn, Altho Je pense qu'un peu plus général. // a dû créer un concept d'objet de processus qui pourrait être chargé à partir d'un fichier ou cloné du processus en cours (ou d'un processus d'exécution différent).


Mais devait également essentiellement prendre chaque syscall et mettre en œuvre une version qui pourrait être appliquée à un tel objet de processus. Qui s'élevait à fournir un argument supplémentaire "process_object_to_be_affected" à chaque syscall. Avec les systèmes SysCalls Unix par défaut étant dégénérés des formulaires, avec "Self" comme "process_object_to_be_affected".


Ceci est faisable. Certainement plus général, et je pense que très utile. (E.G. POSIX SPAWN a été ajouté car de nombreux os wannabé ne pouvaient tout simplement pas faire de la fourche efficacement.) // Mais c'était beaucoup de travail, bien que ne travaille sans doute que ce qui aurait jamais besoin d'être fait une fois. // Quoi qu'il en soit, beaucoup de travail => Annulé, proposition rejetée, après avoir fait la top des ramets SysCalls. // note [*]: conçu = conçu, codé certains mais pas tous. Annulé.


Une observation finale: au fil des ans, UNIX et Linux ont lentement ajouté un tel "Do SysCall sur le processus distant" en proie à de plus en plus de systèmes de système SysCalls. Ptrace, en particulier, peut faire beaucoup de ces choses. Les debuggers doivent.



0
votes

du livre brouillon, XV6 Un simple, UNIX- Comme le système d'exploitation d'enseignement utilisé dans le cours MIT 6.828:

Maintenant, il devrait être clair pourquoi il est une bonne idée que Fork et Exec sont des appels distincts. Étant donné que s'ils sont séparés, la coquille peut fourche un enfant, utiliser ouvert, fermer, DUP à l'enfant pour modifier les descripteurs de fichiers d'entrée et de sortie standard, puis exécutant. Aucune modification du programme en cours d'exécution (CAT dans notre exemple) n'est requise. Si Fork and Exec a été combinée à un seul appel système, un autre système (probablement plus complexe) serait nécessaire pour que la coquille redirigeait l'entrée et la sortie standard, ou que le programme lui-même devrait comprendre comment rediriger les E / S.

Fondamentalement, comme dit Caf ci-dessous mais fournissant une bonne référence. La mise en œuvre d'une coque simple ferait probablement les raisons très claires.


0 commentaires