[Je vais répéter une partie de ma réponse à partir d' ici .]
Pourquoi ne pas simplement avoir une commande qui crée un nouveau processus à partir de zéro? N'est-il pas absurde et inefficace d'en copier un qui ne sera remplacé que tout de suite?
En fait, cela ne serait probablement pas aussi efficace pour plusieurs raisons:
La « copie » produit par fork()
est un peu une abstraction, car le noyau utilise une copie sur écriture du système ; tout ce qui doit être créé est une carte mémoire virtuelle. Si la copie appelle alors immédiatement exec()
, la plupart des données qui auraient été copiées si elles avaient été modifiées par l'activité du processus ne doivent jamais être copiées / créées car le processus ne nécessite aucune utilisation.
Divers aspects significatifs du processus enfant (par exemple son environnement) ne doivent pas nécessairement être dupliqués individuellement ou définis en fonction d'une analyse complexe du contexte, etc. Ils sont simplement supposés être identiques à ceux du processus appelant. c'est le système assez intuitif que nous connaissons.
Pour expliquer # 1 un peu plus loin, la mémoire qui est "copiée" mais jamais accédée par la suite n’est jamais vraiment copiée, du moins dans la plupart des cas. Une exception dans ce contexte pourrait être si vous avez créé un processus, puis le processus parent s'est terminé avant que l'enfant ne se remplace lui-même exec()
. Je dis pourrait parce qu'une grande partie du parent pourrait être mise en cache si la mémoire disponible est suffisante et je ne sais pas dans quelle mesure cela serait exploité (ce qui dépendrait de la mise en œuvre du système d'exploitation).
Bien sûr, cela ne rend pas à première vue l'utilisation d'une copie plus efficace que celle d'une ardoise vierge - sauf que "l'ardoise vierge" n'est pas littéralement rien, et doit impliquer une attribution. Le système pourrait avoir un modèle de processus vierge / nouveau, générique, qu'il copie de la même manière 1, mais qui ne sauvegarderait alors rien, par rapport à la fourchette de copie sur écriture. Donc, n ° 1 démontre simplement que l'utilisation d'un "nouveau" processus vide ne serait pas plus efficace.
Le point 2 explique pourquoi l'utilisation de la fourche est probablement plus efficace. L'environnement d'un enfant est hérité de son parent, même s'il s'agit d'un exécutable complètement différent. Par exemple, si le processus parent est un shell et l’enfant, un navigateur Web, $HOME
reste identique pour les deux, mais puisque l’un ou l’autre pourrait le changer par la suite, il doit s'agir de deux copies distinctes. Celui de l'enfant est produit par l'original fork()
.
1. Une stratégie qui n'a peut-être pas beaucoup de sens littéral, mais ce que je veux dire, c'est que créer un processus implique plus que copier son image dans la mémoire à partir d'un disque.