Panggilan sistem UNIX untuk pembuatan proses, fork (), menciptakan proses anak dengan menyalin proses induk. Pemahaman saya adalah bahwa ini hampir selalu diikuti oleh panggilan ke exec () untuk mengganti ruang memori proses anak (termasuk segmen teks). Menyalin ruang memori orang tua dalam fork () selalu tampak boros bagi saya (meskipun saya menyadari pemborosan dapat diminimalkan dengan membuat segmen memori copy-on-write sehingga hanya pointer yang disalin). Lagi pula, apakah ada yang tahu mengapa pendekatan duplikasi ini diperlukan untuk proses pembuatan?
process
process-management
fork
Ellen Spertus
sumber
sumber
fork(2)
halaman manual di Linux mengatakan:Under Linux, fork() is implemented using copy-on-write pages, so the only penalty that it incurs is the time and memory required to duplicate the parent's page tables, and to create a unique task structure for the child.
Saya membayangkan (tetapi tidak tahu pasti) bahwa ini adalah kasus untuk rasa Unix modern lainnya.select
putus, tapi itu cerita lain).Jawaban:
Ini untuk menyederhanakan antarmuka. Alternatif untuk
fork
danexec
akan menjadi sesuatu seperti fungsi CreateProcess Windows . Perhatikan berapa banyak parameter yangCreateProcess
dimiliki, dan banyak dari mereka adalah struct dengan lebih banyak parameter. Ini karena semua yang Anda mungkin ingin kontrol tentang proses baru harus diteruskanCreateProcess
. Faktanya,CreateProcess
tidak memiliki parameter yang cukup, jadi Microsoft harus menambahkan CreateProcessAsUser dan CreateProcessWithLogonW .Dengan
fork/exec
model, Anda tidak perlu semua parameter itu. Alih-alih, atribut tertentu dari proses dipertahankan di seluruhexec
. Ini memungkinkan Anda untukfork
, kemudian mengubah atribut proses apa pun yang Anda inginkan (menggunakan fungsi yang sama seperti yang biasa Anda gunakan), laluexec
. Di Linux,fork
tidak memiliki parameter, danexecve
hanya memiliki 3: program untuk dijalankan, baris perintah untuk memberikannya, dan lingkungannya. (Adaexec
fungsi - fungsi lain , tetapi mereka hanya pembungkus yangexecve
disediakan oleh perpustakaan C untuk menyederhanakan kasus penggunaan umum.)Jika Anda ingin memulai proses dengan direktori saat ini berbeda:
fork
,chdir
,exec
.Jika Anda ingin mengarahkan ulang stdin / stdout:,
fork
tutup / buka fileexec
,.Jika Anda ingin pengguna beralih:
fork
,setuid
,exec
.Semua hal ini dapat digabungkan sesuai kebutuhan. Jika seseorang menghasilkan atribut proses jenis baru, Anda tidak perlu mengubah
fork
danexec
.Seperti yang disebutkan oleh larsks, sebagian besar Unix modern menggunakan copy-on-write, jadi
fork
tidak melibatkan overhead yang signifikan.sumber
Sebagai tambahan untuk jawaban cjm, Spesifikasi Unix Tunggal mendefinisikan fungsi bernama
vfork()
. Fungsi itu bekerja seperti garpu, kecuali bahwa proses bercabang memiliki perilaku yang tidak terdefinisi jika melakukan apa pun selain mencoba memanggil fungsi keluarga eksekutif, atau memanggil_exit()
.Jadi cukup banyak satu-satunya penggunaan dengan perilaku yang didefinisikan adalah:
Jadi apa fungsinya
vfork
? Itu murahfork
. Dalam implementasi tanpa copy-on-write, proses yang dihasilkan akan berbagi ruang memori dengan proses asli (karenanya perilaku yang tidak terdefinisi). Dalam implementasi dengan copy-on-write,vfork
diizinkan untuk identik denganfork()
, karena implementasi copy-on-write cepat.Ada juga
posix_spawn
fungsi opsional (danposix_spawnp
fungsi) yang langsung dapat membuat proses baru. (Ini juga diperbolehkan untuk mengimplementasikannya dengan panggilan pustaka menggunakanfork
danexec
, dan contoh implementasi disediakan.)sumber