The keseluruhan dari fork()
diimplementasikan menggunakan mmap / menyalin pada menulis.
Ini tidak hanya memengaruhi tumpukan, tetapi juga berbagi perpustakaan, tumpukan, area BSS.
Yang, kebetulan, berarti garpu adalah operasi yang sangat ringan, sampai 2 proses yang dihasilkan (orang tua dan anak) benar-benar mulai menulis ke rentang memori. Fitur ini adalah kontributor utama dari mematikan bom fork - Anda berakhir dengan terlalu banyak proses sebelum kernel menjadi kelebihan dengan replikasi dan diferensiasi halaman.
Anda akan kesulitan menemukan di OS modern contoh operasi di mana kernel melakukan hard copy (pengecualian driver perangkat) - hanya jauh, lebih mudah dan lebih efisien untuk menggunakan fungsionalitas VM.
Bahkan execve()
pada dasarnya adalah "tolong mmap binary / ld.so / yang lainnya, diikuti dengan eksekusi" - dan VM menangani pemuatan aktual dari proses ke RAM dan eksekusi. Variabel tak diinisialisasi lokal berakhir dengan mmaped dari 'nol-halaman' - halaman read-only copy-on-write khusus yang mengandung nol, variabel inisialisasi lokal akhirnya menjadi mmaped (copy-on-write, lagi) dari file biner itu sendiri, dll.