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).vfork()
- crée un nouveau processus enfant, qui est une copie "rapide" du processus parent. Contrairement à l'appel systèmefork()
, 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 classiquefork()
! 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 soitexec()
(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 defork()
pour le modèle "fork-and-exec". Il peut être exécuté 4 à 5 fois plus rapidement que lefork()
, car contrairement aufork()
(même avec COW gardé à l'esprit), implémentation devfork()
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).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 depthread_create()
et toute la famille dufork()
appels système.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 avecfork()
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 unfork()
était suivi deexec()
, 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", doncfork()
+exec()
est tout aussi efficace quevfork()
+exec()
. -
clone()
est l'appel système utilisé parfork()
. 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 defork()
, destiné à être utilisé lorsqueexecve()
est appelé directement aprèsfork()
. 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 lorsquefork()
des processus avec une énorme empreinte mémoire pour exécuter un petit programme (pensez auRuntime.exec()
de Java ). POSIX a standardisé leposix_spawn()
pour remplacer ces deux dernières utilisations plus modernes devfork()
.posix_spawn()
fait l'équivalent d'unfork()/execve()
, et permet également de jongler avec fd entre les deux. Il est censé remplacerfork()/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 defork()
àpthread_create()
. Cela donne beaucoup de contrôle. Inspiré derfork()
.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.