GNU/Linux >> Belajar Linux >  >> Linux

Mengapa Garpu Mekanisme Pembuatan Proses Default?

Panggilan sistem UNIX untuk pembuatan proses, fork(), membuat proses anak dengan menyalin proses induk. Pemahaman saya adalah bahwa ini hampir selalu diikuti oleh panggilan ke exec() untuk menggantikan ruang memori proses anak (termasuk segmen teks). Menyalin ruang memori induk di fork() selalu tampak sia-sia bagi saya (walaupun saya menyadari pemborosan dapat diminimalkan dengan membuat segmen memori copy-on-write sehingga hanya pointer yang disalin). Bagaimanapun, adakah yang tahu mengapa pendekatan duplikasi ini diperlukan untuk pembuatan proses?

Jawaban yang Diterima:

Ini untuk menyederhanakan antarmuka. Alternatif untuk fork dan exec akan menjadi sesuatu seperti fungsi CreateProcess Windows. Perhatikan berapa banyak parameter CreateProcess memiliki, dan banyak dari mereka adalah struct dengan lebih banyak parameter. Ini karena semuanya Anda mungkin ingin mengontrol tentang proses baru yang harus diteruskan ke CreateProcess . Faktanya, CreateProcess tidak memiliki cukup parameter, sehingga Microsoft harus menambahkan CreateProcessAsUser dan CreateProcessWithLogonW.

Dengan fork/exec model, Anda tidak memerlukan semua parameter itu. Sebagai gantinya, atribut tertentu dari proses dipertahankan di seluruh exec . Ini memungkinkan Anda untuk fork , lalu ubah atribut proses apa pun yang Anda inginkan (menggunakan fungsi yang sama dengan yang biasa Anda gunakan), dan lalu exec . Di Linux, fork tidak memiliki parameter, dan execve hanya memiliki 3:program untuk dijalankan, baris perintah untuk diberikan, dan lingkungannya. (Ada exec lainnya fungsi, tetapi mereka hanya membungkus execve disediakan oleh pustaka C untuk menyederhanakan kasus penggunaan umum.)

Jika Anda ingin memulai proses dengan direktori saat ini yang berbeda:fork , chdir , exec .

Jika Anda ingin mengarahkan ulang stdin/stdout:fork , tutup/buka file, exec .

Jika Anda ingin mengganti pengguna:fork , setuid , exec .

Semua hal ini dapat dikombinasikan sesuai kebutuhan. Jika seseorang datang dengan atribut proses jenis baru, Anda tidak perlu mengubah fork dan exec .

Seperti yang disebutkan larsks, sebagian besar Unix modern menggunakan copy-on-write, jadi fork tidak melibatkan overhead yang signifikan.


Linux
  1. BCRYPT - Mengapa Distribusi Linux tidak menggunakannya secara default?

  2. Apakah kernel Linux 3.x menggunakan penjadwal proses CFS?

  3. Dimana fork() pada fork bomb :(){ :|:&};:?

  1. Grep – Mengapa Kurung Dalam Pola Grep Menghapus Proses Grep Dari Hasil Ps?

  2. Mengapa sed tidak menggunakan mode regex yang diperluas secara default?

  3. Mengapa vfork() dimaksudkan untuk digunakan ketika proses anak memanggil exec() atau exit() segera setelah pembuatan?

  1. Mengapa Proses Pgid Anak Bukan Pid Orang Tua?

  2. Mengapa Python 2.7 Masih Versi Python Default Di Ubuntu?

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