GNU/Linux >> Belajar Linux >  >> Linux

Perbedaan antara fork(), vfork(), exec() dan clone()

  1. 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).
  2. vfork() - membuat proses anak baru, yang merupakan salinan "cepat" dari proses induk. Berbeda dengan system call fork() , 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 klasik fork() ! Untuk mencegah interferensi yang tidak diinginkan antara induk dan anak, yang menggunakan tumpukan yang sama, eksekusi proses induk dibekukan hingga anak memanggil exec() (buat ruang alamat virtual baru dan transisi ke stack yang berbeda) atau _exit() (penghentian eksekusi proses). vfork() adalah optimalisasi dari fork() untuk model "fork-and-exec". Ini dapat dilakukan 4-5 kali lebih cepat daripada fork() , karena tidak seperti fork() (bahkan dengan mengingat COW), penerapan vfork() panggilan sistem tidak mencakup pembuatan ruang alamat baru (alokasi dan penyiapan direktori halaman baru).
  3. 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 implementasi pthread_create() dan semua keluarga dari fork() panggilan sistem.
  4. 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 dengan fork() 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 kasus fork() diikuti oleh exec() , 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", jadi fork() +exec() sama efisiennya dengan vfork() +exec() .

  • clone() adalah syscall yang digunakan oleh fork() . 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 dari fork() , dimaksudkan untuk digunakan saat execve() dipanggil langsung setelah fork() . Ternyata bekerja dengan baik di sistem non-MMU (di mana fork() tidak dapat bekerja secara efisien) dan saat fork() ing proses dengan jejak memori yang besar untuk menjalankan beberapa program kecil (pikirkan Runtime.exec() Java ). POSIX telah membakukan posix_spawn() untuk menggantikan kedua penggunaan vfork() yang lebih modern ini .
  • posix_spawn() apakah setara dengan fork()/execve() , dan juga memungkinkan beberapa juggling fd di antaranya. Seharusnya menggantikan fork()/execve() , terutama untuk platform non-MMU.
  • pthread_create() membuat utas baru.
  • clone() adalah panggilan khusus Linux, yang dapat digunakan untuk mengimplementasikan apa pun dari fork() ke pthread_create() . Ini memberi banyak kendali. Terinspirasi dari rfork() .
  • rfork() adalah panggilan khusus Rencana-9. Ini seharusnya menjadi panggilan umum, memungkinkan berbagi beberapa derajat, antara proses penuh dan utas.

Linux
  1. Perbedaan Getty dan Agetty?

  2. Perbedaan Kill, Pkill, dan Killall?

  3. Perbedaan Antara .exrc Dan .vimrc?

  1. Perbedaan Antara '$ . Foo' Dan '$ ./foo'??

  2. Perbedaan Antara 'env' dan 'printenv'?

  3. Perbedaan antara tumpukan Java dan tumpukan C asli

  1. Apa perbedaan antara strtok_r dan strtok_s di C?

  2. Apa perbedaan antara ls dan l?

  3. Apa perbedaan antara Non-preemptive, Preemptive dan Selective Preemptive Kernel?