Menurut Wikipedia (yang bisa salah)
Ketika fork () panggilan sistem dikeluarkan, salinan dari semua halaman yang sesuai dengan proses induk dibuat, dimuat ke lokasi memori terpisah oleh OS untuk proses anak. Tetapi ini tidak diperlukan dalam kasus-kasus tertentu. Pertimbangkan kasus ketika seorang anak mengeksekusi
exec
panggilan sistem " " (yang digunakan untuk mengeksekusi file yang dapat dieksekusi dari dalam program C) atau keluar segera setelahfork()
. Ketika anak diperlukan hanya untuk mengeksekusi perintah untuk proses induk, tidak perlu menyalin halaman proses induk, karenaexec
menggantikan ruang alamat dari proses yang memanggilnya dengan perintah yang akan dieksekusi.Dalam kasus seperti itu, teknik yang disebut copy-on-write (COW) digunakan. Dengan teknik ini, ketika garpu terjadi, halaman proses induk tidak disalin untuk proses anak. Sebaliknya, halaman dibagi antara proses anak dan orang tua. Setiap kali suatu proses (orang tua atau anak) memodifikasi halaman, salinan terpisah dari halaman tertentu dibuat untuk proses tersebut (orang tua atau anak) yang melakukan modifikasi. Proses ini kemudian akan menggunakan halaman yang baru disalin daripada yang dibagikan di semua referensi di masa depan. Proses lain (yang tidak mengubah halaman bersama) terus menggunakan salinan asli halaman (yang sekarang tidak lagi dibagikan). Teknik ini disebut copy-on-write karena halaman disalin ketika beberapa proses menulis padanya.
Tampaknya ketika salah satu proses mencoba menulis ke halaman, salinan halaman baru akan dialokasikan dan ditugaskan untuk proses yang menghasilkan kesalahan halaman. Halaman asli ditandai setelah itu dapat ditulis.
Pertanyaan saya adalah: apa yang terjadi jika fork()
dipanggil berkali-kali sebelum ada proses yang mencoba menulis ke halaman bersama?
pmap -XX PID
atau cat /proc/PID/smap
.