Secondo Wikipedia (che potrebbe essere sbagliato)
Quando viene emessa una chiamata di sistema fork (), viene creata una copia di tutte le pagine corrispondenti al processo padre, caricata in una posizione di memoria separata dal sistema operativo per il processo figlio. Ma questo non è necessario in alcuni casi. Considerare il caso in cui un figlio esegue una "
exec
" chiamata di sistema (che viene utilizzata per eseguire qualsiasi file eseguibile dall'interno di un programma C) o esce molto presto dopo ilfork()
. Quando il figlio è necessario solo per eseguire un comando per il processo padre, non è necessario copiare le pagine del processo padre, poichéexec
sostituisce lo spazio degli indirizzi del processo che lo ha invocato con il comando da eseguire.In tali casi, viene utilizzata una tecnica chiamata copia-su-scrittura (COW). Con questa tecnica, quando si verifica un fork, le pagine del processo padre non vengono copiate per il processo figlio. Invece, le pagine sono condivise tra il processo figlio e il processo padre. Ogni volta che un processo (padre o figlio) modifica una pagina, viene creata una copia separata di quella pagina specifica per quel processo (padre o figlio) che ha eseguito la modifica. Questo processo utilizzerà quindi la pagina appena copiata anziché quella condivisa in tutti i riferimenti futuri. L'altro processo (quello che non ha modificato la pagina condivisa) continua a utilizzare la copia originale della pagina (che ora non è più condivisa). Questa tecnica è chiamata copia su scrittura poiché la pagina viene copiata quando un processo scrive su di essa.
Sembra che quando uno dei processi tenta di scrivere sulla pagina una nuova copia della pagina viene allocata e assegnata al processo che ha generato l'errore di pagina. La pagina originale viene contrassegnata in seguito scrivibile.
La mia domanda è: cosa succede se fork()
viene chiamato più volte prima che qualcuno dei processi abbia tentato di scrivere su una pagina condivisa?
pmap -XX PID
o cat /proc/PID/smap
.