GNU/Linux >> Tutoriels Linux >  >> Linux

La différence entre fork(), vfork(), exec() et clone()

  1. fork() - crée un nouveau processus enfant, qui est une copie complète du processus parent. Les processus enfants et parents utilisent des espaces d'adressage virtuels différents, qui sont initialement remplis par les mêmes pages de mémoire. Ensuite, au fur et à mesure que les deux processus sont exécutés, les espaces d'adressage virtuels commencent à différer de plus en plus, car le système d'exploitation effectue une copie paresseuse des pages mémoire en cours d'écriture par l'un ou l'autre de ces deux processus et attribue une copie indépendante des pages modifiées de mémoire pour chaque processus. Cette technique s'appelle Copy-On-Write (COW).
  2. vfork() - crée un nouveau processus enfant, qui est une copie "rapide" du processus parent. Contrairement à l'appel système fork() , les processus enfant et parent partagent le même espace d'adressage virtuel. REMARQUE! En utilisant le même espace d'adressage virtuel, le parent et l'enfant utilisent la même pile, le pointeur de pile et le pointeur d'instruction, comme dans le cas du classique fork() ! Pour éviter toute interférence indésirable entre le parent et l'enfant, qui utilisent la même pile, l'exécution du processus parent est gelée jusqu'à ce que l'enfant appelle soit exec() (créer un nouvel espace d'adressage virtuel et une transition vers une pile différente) ou _exit() (arrêt de l'exécution du processus). vfork() est l'optimisation de fork() pour le modèle "fork-and-exec". Il peut être exécuté 4 à 5 fois plus rapidement que le fork() , car contrairement au fork() (même avec COW gardé à l'esprit), implémentation de vfork() l'appel système n'inclut pas la création d'un nouvel espace d'adressage (l'allocation et la configuration de nouveaux répertoires de pages).
  3. clone() - crée un nouveau processus enfant. Divers paramètres de cet appel système spécifient quelles parties du processus parent doivent être copiées dans le processus enfant et quelles parties seront partagées entre eux. Par conséquent, cet appel système peut être utilisé pour créer toutes sortes d'entités d'exécution, en partant de threads et en terminant par des processus complètement indépendants. En fait, clone() l'appel système est la base qui est utilisée pour l'implémentation de pthread_create() et toute la famille du fork() appels système.
  4. exec() - réinitialise toute la mémoire du processus, charge et analyse le binaire exécutable spécifié, configure une nouvelle pile et passe le contrôle au point d'entrée de l'exécutable chargé. Cet appel système ne rend jamais le contrôle à l'appelant et sert au chargement d'un nouveau programme dans le processus déjà existant. Cet appel système avec fork() appel système forment ensemble un modèle de gestion de processus UNIX classique appelé "fork-and-exec".

  • vfork() est une optimisation obsolète. Avant une bonne gestion de la mémoire, fork() fait une copie complète de la mémoire des parents, donc c'était assez cher. puisque dans de nombreux cas un fork() était suivi de exec() , qui supprime la carte mémoire actuelle et en crée une nouvelle, c'était une dépense inutile. De nos jours, fork() ne copie pas la mémoire ; il est simplement défini comme "copie sur écriture", donc fork() +exec() est tout aussi efficace que vfork() +exec() .

  • clone() est l'appel système utilisé par fork() . avec certains paramètres, il crée un nouveau processus, avec d'autres, il crée un thread. la différence entre eux est juste quelles structures de données (espace mémoire, état du processeur, pile, PID, fichiers ouverts, etc.) sont partagées ou non.


  • execve() remplace l'image exécutable actuelle par une autre chargée à partir d'un fichier exécutable.
  • fork() crée un processus enfant.
  • vfork() est une version optimisée historique de fork() , destiné à être utilisé lorsque execve() est appelé directement après fork() . Il s'est avéré qu'il fonctionnait bien dans les systèmes non MMU (où fork() ne peut pas fonctionner de manière efficace) et lorsque fork() des processus avec une énorme empreinte mémoire pour exécuter un petit programme (pensez au Runtime.exec() de Java ). POSIX a standardisé le posix_spawn() pour remplacer ces deux dernières utilisations plus modernes de vfork() .
  • posix_spawn() fait l'équivalent d'un fork()/execve() , et permet également de jongler avec fd entre les deux. Il est censé remplacer fork()/execve() , principalement pour les plates-formes non MMU.
  • pthread_create() crée un nouveau fil.
  • clone() est un appel spécifique à Linux, qui peut être utilisé pour implémenter n'importe quoi à partir de fork() à pthread_create() . Cela donne beaucoup de contrôle. Inspiré de rfork() .
  • rfork() est un appel spécifique au Plan-9. C'est censé être un appel générique, permettant plusieurs degrés de partage, entre les processus complets et les threads.

Linux
  1. Quelle est la différence entre Sudo Su - et Sudo Su - ?

  2. La différence entre Getty et Agetty ?

  3. La différence entre .exrc et .vimrc ?

  4. La différence entre '$ . Foo' Et '$ ./foo' ? ?

  5. La différence entre ~/.profile et ~/.bash_profile ?

Quelle est la différence entre Linux et Unix ?

La différence entre "env" et "printenv" ?

Qu'est-ce qu'un Hyperviseur ? Quelle est la différence entre les types 1 et 2 ?

Quelle est la différence entre curl et Wget ?

Quelle est la différence entre strtok_r et strtok_s en C ?

Quelle est la différence entre unlink et rm ?