Selon Wikipedia (ce qui pourrait être faux)
Lorsqu'un appel système fork () est émis, une copie de toutes les pages correspondant au processus parent est créée, chargée dans un emplacement mémoire séparé par le système d'exploitation pour le processus enfant. Mais cela n'est pas nécessaire dans certains cas. Considérez le cas où un enfant exécute un "
exec
" appel système (qui est utilisé pour exécuter n'importe quel fichier exécutable depuis un programme C) ou se termine très peu de temps aprèsfork()
. Lorsque l'enfant est nécessaire uniquement pour exécuter une commande pour le processus parent, il n'est pas nécessaire de copier les pages du processus parent, carexec
remplace l'espace d'adressage du processus qui l'a invoqué par la commande à exécuter.Dans de tels cas, une technique appelée copie sur écriture (COW) est utilisée. Avec cette technique, lorsqu'un fork se produit, les pages du processus parent ne sont pas copiées pour le processus enfant. Au lieu de cela, les pages sont partagées entre l'enfant et le processus parent. Chaque fois qu'un processus (parent ou enfant) modifie une page, une copie distincte de cette page particulière seule est créée pour ce processus (parent ou enfant) qui a effectué la modification. Ce processus utilisera alors la page nouvellement copiée plutôt que celle partagée dans toutes les références futures. L'autre processus (celui qui n'a pas modifié la page partagée) continue d'utiliser la copie d'origine de la page (qui n'est plus partagée maintenant). Cette technique est appelée copie sur écriture car la page est copiée lorsqu'un processus y écrit.
Il semble que lorsque l'un des processus tente d'écrire sur la page, une nouvelle copie de la page est allouée et affectée au processus qui a généré l'erreur de page. La page d'origine est marquée en écriture par la suite.
Ma question est: que se passe-t-il si le fork()
obtient appelé plusieurs fois avant que l'un des processus ne tente d'écrire sur une page partagée?
pmap -XX PID
ou cat /proc/PID/smap
.