fork()
- membuat proses anak baru, yang merupakan salinan lengkap dari proses induk. Proses anak dan orang tua menggunakan ruang alamat virtual yang berbeda, yang awalnya diisi oleh halaman memori yang sama. Kemudian, ketika kedua proses dieksekusi, ruang alamat virtual mulai semakin berbeda, karena sistem operasi melakukan penyalinan halaman memori yang sedang ditulis oleh salah satu dari dua proses ini dan menetapkan salinan independen dari halaman yang dimodifikasi dari memori untuk setiap proses. Teknik ini disebut Copy-On-Write (COW).vfork()
- membuat proses anak baru, yang merupakan salinan "cepat" dari proses induk. Berbeda dengan system callfork()
, proses anak dan orang tua berbagi ruang alamat virtual yang sama. CATATAN! Menggunakan ruang alamat virtual yang sama, induk dan anak menggunakan tumpukan yang sama, penunjuk tumpukan dan penunjuk instruksi, seperti dalam kasus klasikfork()
! Untuk mencegah interferensi yang tidak diinginkan antara induk dan anak, yang menggunakan tumpukan yang sama, eksekusi proses induk dibekukan hingga anak memanggilexec()
(buat ruang alamat virtual baru dan transisi ke stack yang berbeda) atau_exit()
(penghentian eksekusi proses).vfork()
adalah optimalisasi darifork()
untuk model "fork-and-exec". Ini dapat dilakukan 4-5 kali lebih cepat daripadafork()
, karena tidak sepertifork()
(bahkan dengan mengingat COW), penerapanvfork()
panggilan sistem tidak mencakup pembuatan ruang alamat baru (alokasi dan penyiapan direktori halaman baru).clone()
- membuat proses anak baru. Berbagai parameter dari pemanggilan sistem ini, menentukan bagian mana dari proses induk yang harus disalin ke dalam proses anak dan bagian mana yang akan dibagi di antara mereka. Akibatnya, pemanggilan sistem ini dapat digunakan untuk membuat semua jenis entitas eksekusi, mulai dari utas dan diakhiri dengan proses yang sepenuhnya independen. Faktanya,clone()
system call adalah basis yang digunakan untuk implementasipthread_create()
dan semua keluarga darifork()
panggilan sistem.exec()
- mengatur ulang semua memori proses, memuat dan mem-parsing biner yang dapat dieksekusi yang ditentukan, mengatur tumpukan baru dan meneruskan kontrol ke titik masuk dari file yang dapat dieksekusi yang dimuat. Panggilan sistem ini tidak pernah mengembalikan kontrol ke pemanggil dan berfungsi untuk memuat program baru ke proses yang sudah ada. Panggilan sistem ini denganfork()
system call bersama membentuk model manajemen proses UNIX klasik yang disebut "fork-and-exec".
-
vfork()
adalah optimasi usang. Sebelum manajemen memori yang baik,fork()
membuat salinan lengkap dari ingatan orang tua, jadi itu cukup mahal. karena dalam banyak kasusfork()
diikuti olehexec()
, yang membuang peta memori saat ini dan membuat yang baru, itu adalah pengeluaran yang tidak perlu. Saat ini,fork()
tidak menyalin memori; itu hanya disetel sebagai "copy on write", jadifork()
+exec()
sama efisiennya denganvfork()
+exec()
. -
clone()
adalah syscall yang digunakan olehfork()
. dengan beberapa parameter, ia membuat proses baru, dengan yang lain, ia membuat utas. perbedaan di antara keduanya hanyalah struktur data mana (ruang memori, status prosesor, tumpukan, PID, file terbuka, dll.) yang dibagikan atau tidak.
execve()
mengganti gambar yang dapat dieksekusi saat ini dengan gambar lain yang diambil dari file yang dapat dieksekusi.fork()
membuat proses anak.vfork()
adalah versi historis yang dioptimalkan darifork()
, dimaksudkan untuk digunakan saatexecve()
dipanggil langsung setelahfork()
. Ternyata bekerja dengan baik di sistem non-MMU (di manafork()
tidak dapat bekerja secara efisien) dan saatfork()
ing proses dengan jejak memori yang besar untuk menjalankan beberapa program kecil (pikirkanRuntime.exec()
Java ). POSIX telah membakukanposix_spawn()
untuk menggantikan kedua penggunaanvfork()
yang lebih modern ini .posix_spawn()
apakah setara denganfork()/execve()
, dan juga memungkinkan beberapa juggling fd di antaranya. Seharusnya menggantikanfork()/execve()
, terutama untuk platform non-MMU.pthread_create()
membuat utas baru.clone()
adalah panggilan khusus Linux, yang dapat digunakan untuk mengimplementasikan apa pun darifork()
kepthread_create()
. Ini memberi banyak kendali. Terinspirasi darirfork()
.rfork()
adalah panggilan khusus Rencana-9. Ini seharusnya menjadi panggilan umum, memungkinkan berbagi beberapa derajat, antara proses penuh dan utas.
Bagaimana cara menyalurkan panggilan subproses ke file teks?
Bagaimana cara mengurutkan file, berdasarkan nilai numeriknya untuk suatu bidang?