Halaman manual biasanya merupakan dokumen referensi singkat. Wikipedia adalah tempat yang lebih baik untuk mencari penjelasan konseptual.
Fork menduplikasi suatu proses: itu menciptakan proses anak yang hampir identik dengan proses induk (perbedaan yang paling jelas adalah bahwa proses baru memiliki ID proses yang berbeda). Secara khusus, garpu (secara konseptual) harus menyalin semua memori proses induk.
Karena ini agak mahal, vfork diciptakan untuk menangani kasus khusus umum di mana salinannya tidak diperlukan. Seringkali, hal pertama yang dilakukan proses anak adalah memuat gambar program baru, jadi inilah yang terjadi:
if (fork()) {
# parent process …
} else {
# child process (with a new copy of the process memory)
execve("/bin/sh", …); # discard the process memory
}
The execve
panggilan beban program executable baru, dan menggantikan ini proses kode dan data memori dengan kode executable baru dan memori data segar. Jadi seluruh salinan memori yang dibuat oleh fork
semua untuk apa-apa.
Jadi vfork
panggilan itu diciptakan. Itu tidak membuat salinan dari memori. Karena vfork
itu murah, tetapi sulit digunakan karena Anda harus memastikan Anda tidak mengakses tumpukan proses atau ruang tumpukan dalam proses anak. Perhatikan bahwa bahkan membaca dapat menjadi masalah, karena proses induk terus dijalankan. Sebagai contoh, kode ini rusak (mungkin atau tidak dapat bekerja tergantung pada apakah anak atau orang tua mendapat potongan waktu terlebih dahulu):
if (vfork()) {
# parent process
cmd = NULL; # modify the only copy of cmd
} else {
# child process
execve("/bin/sh", "sh", "-c", cmd, (char*)NULL); # read the only copy of cmd
}
Sejak penemuan vfork, optimalisasi yang lebih baik telah ditemukan. Sebagian besar sistem modern, termasuk Linux, menggunakan bentuk copy-on-write , di mana halaman dalam memori proses tidak disalin pada saat fork
panggilan, tetapi kemudian ketika orang tua atau anak pertama kali menulis ke halaman. Yaitu, setiap halaman dimulai sebagai dibagikan, dan tetap dibagikan sampai proses menulis ke halaman itu; proses yang menulis mendapat halaman fisik baru (dengan alamat virtual yang sama). Copy-on-write membuat vfork sebagian besar tidak berguna, karena fork
tidak akan membuat salinan dalam kasus di mana vfork
akan dapat digunakan.
Linux mempertahankan vfork. The fork
system call masih harus membuat salinan dari proses ini tabel memori virtual, bahkan jika itu tidak menyalin memori yang sebenarnya; vfork
bahkan tidak perlu melakukan ini. Peningkatan kinerja dapat diabaikan di sebagian besar aplikasi.