Bagaimana cara kerja fork dan exec?

17

Saya tidak punya banyak pengalaman, hanya mencoba untuk terlibat dalam proses bagaimana mereka menginterpretasikan ke perangkat keras dari tingkat pengguna.

Jadi ketika sebuah perintah ditembakkan dari shell, fork()mewarisi proses anak dari itu dan exec()memuat proses anak ke memori dan dijalankan.

  1. Jika proses anak berisi semua atribut dari proses induk (yang merupakan proses asli), lalu apa kebutuhan proses anak ini? Proses aslinya juga bisa dimuat ke memori.
  2. Apakah konsep forkdan ini execberlaku untuk semua program yang dapat dieksekusi di UNIX? Suka untuk skrip shell juga atau hanya untuk perintah? Apakah itu juga berlaku untuk perintah shell builtin?
  3. Kapan konsep copy on write digunakan jika saya akan menjalankan perintah / skrip?

Maaf telah mengajukan banyak pertanyaan sekaligus, tetapi semua pertanyaan ini langsung terlintas di benak saya ketika saya berpikir tentang eksekusi perintah.

PriB
sumber
Saya tidak akan mengatakan ini adalah duplikat, tetapi saya pikir beberapa pertanyaan Anda dijawab di sini: unix.stackexchange.com/questions/136637/… dan di jawaban yang lain terhubung di bagian atas yang itu.
goldilocks

Jawaban:

22

Jadi ketika sebuah perintah ditembakkan dari shell, fork () mewarisi proses anak dari itu dan exec () memuat proses anak ke memori dan mengeksekusi.

Tidak terlalu. fork()mengkloning proses saat ini, menciptakan anak yang identik. exec()memuat program baru ke dalam proses saat ini, menggantikan yang sudah ada.

Qs saya adalah:

Jika proses anak berisi semua atribut dari proses induk (yang merupakan proses asli), lalu apa kebutuhan proses anak ini? Proses aslinya juga bisa dimuat ke memori.

Kebutuhannya adalah karena proses induk belum ingin mengakhiri; ia ingin proses baru berjalan dan melakukan sesuatu pada saat yang sama yang terus dijalankannya juga.

Apakah konsep fork dan exec ini berlaku untuk semua program yang dapat dieksekusi di UNIX? Seperti untuk skrip shell juga atau hanya untuk perintah? Apakah itu juga berlaku untuk perintah shell builtin?

Untuk perintah eksternal, shell melakukan fork()sehingga perintah berjalan dalam proses baru. Builtin hanya dijalankan oleh shell secara langsung. Perintah penting lainnya adalah exec, yang memberi tahu shell ke exec()program eksternal tanpa terlebih dahulu fork(). Ini berarti bahwa shell itu sendiri diganti dengan program baru, dan tidak ada lagi untuk program yang kembali ketika keluar. Jika Anda mengatakan,, exec truemaka /bin/trueakan mengganti shell Anda, dan segera keluar, tidak meninggalkan apa pun yang berjalan di terminal Anda lagi, jadi itu akan menutup.

ketika konsep copy on write digunakan jika saya akan menjalankan perintah / skrip?

Kembali di zaman batu, fork()sebenarnya harus menyalin semua memori dalam proses panggilan ke proses baru. Salin pada Tulis adalah pengoptimalan di mana tabel halaman diatur sehingga kedua proses memulai berbagi semua memori yang sama, dan hanya halaman yang ditulis oleh proses mana pun yang disalin bila diperlukan.

psusi
sumber
4
"Untuk hampir setiap perintah, shell melakukan fork () sehingga perintah berjalan dalam proses baru. Jika perintah itu adalah builtin, maka anak tidak perlu mengeksekusi () program terpisah." Jawaban yang bagus, tetapi bagian ini harus diedit. Shell tidak bercabang saat menjalankan builtin. Ini berjalan secara langsung dalam proses shell aktif. Ini adalah satu-satunya cara builtin suka cdatau readbisa bekerja. Kurangnya forking juga membuat builtin jauh lebih cepat daripada perintah eksternal.
John Kugelman mendukung Monica
6
  1. Untuk beberapa program, proses anak melakukan satu hal (membaca dari port serial, menulis ke terminal), dan proses induk melanjutkan untuk melakukan sesuatu yang lain (membaca dari terminal, menulis ke port serial). Contoh klasik lainnya adalah proses anak melakukan pemeriksaan di mana pun perhitungan jangka panjangnya berlangsung. Sebagian besar, proses anak melakukan beberapa pengaturan, seperti mengubah direktori, mengatur ulang penangan sinyal atau mengatur ulang deskriptor file, dan kemudian panggilan execve()untuk menindih sendiri dengan kode yang berbeda.
  2. fork()dan exec()memang berlaku untuk semua executable - pada kenyataannya, bersama dengan argc dan argv, dan pipa, garpu dan exec adalah apa yang membedakan Unix dari sistem operasi lain. Ada beberapa spesialisasi atau generalisasi yang fork()ada, seperti BSD vfork(), Plan 9, rfork()dan Linux clone(), tetapi prinsipal tetap sama.
  3. "copy on write" tidak benar-benar muncul ke pengguna, ini lebih merupakan teknik untuk mengoptimalkan membuat proses anak, dan selama eksekusi itu. Tumpukan panggilan dan tumpukan (memori dialokasikan dengan malloc(), atau bahkan variabel ruang lingkup statis atau global) mungkin "copy on write". Ketika proses anak akan dibuat dengan afork()panggilan, kernel akan mengatur proses anak untuk memiliki halaman memori yang sama persis seperti tumpukan dan susun sebagai proses induk. Jika perangkat keras (unit manajemen memori) mendeteksi penulisan tumpukan atau tumpukan, kernel akan mendapatkan halaman fisik baru dari memori, menyalin halaman induk ke halaman baru, dan memetakan halaman baru itu di tumpukan atau tumpukan proses anak. Ini merupakan optimasi karena kernel menghabiskan lebih sedikit waktu untuk mengatur pemetaan halaman daripada menyalin salinan dan menumpuk sepenuhnya untuk proses anak.
Bruce Ediger
sumber
Terima kasih Bruce atas jawaban Anda. Tetapi begitu banyak hal yang telah Anda katakan di sini yang melebihi pikiran saya. Saya tidak memiliki banyak pengetahuan dengan hal-hal ini .. Saya akan mencoba untuk menjalankan fungsi-fungsi ini yang telah Anda sebutkan. Terima kasih banyak..!!
PriB
4
Jika proses anak berisi semua atribut dari proses induk (yang merupakan proses asli), lalu apa kebutuhan proses anak ini? Proses aslinya juga bisa dimuat ke memori.

Pertanyaan ini dijawab dengan sangat ilustratif dengan melihat implementasi Unix paling awal yang harus bekerja di bawah batasan memori yang parah dan hanya memiliki satu proses eksekusi di ruang memori / alamat pada suatu waktu.

Multitasking dicapai dengan menukar proses ke disk dan menukar proses yang berbeda di.

Sekarang forkpemanggilan sistem hampir sama: ia menukar proses ke disk, tetapi alih-alih menukar proses lain, itu memberikan salinan proses id lain dalam memori dan kembali ke proses. Dan itu adalah titik waktu yang tepat untuk proses ini untuk memutuskan untuk hanya execmenjadi executable lain.

fork+ execdengan demikian tidak benar-benar mengeluarkan overhead yang terlihat selama pemijahan: Anda harus menukar proses Anda ke disk, dan Anda memiliki gambar proses lama di lokasi memori yang bisa diterapkan.

Dengan bertambahnya jumlah memori yang tersedia dan unit manajemen memori dan berbagai proses dalam memori, biaya garpu yang awalnya dapat diabaikan menjadi sedikit lebih menyebalkan bagi beberapa arsitektur: karena vforkitu lahir.

pengguna99727
sumber
2

Untuk membuat ini semudah mungkin dimengerti saya akan menggunakan analogi. Mari kita membuat kue!

Kami mengambil buku resep, dan mulai membaca dan memilih pai rhubarb stroberi (favorit saya), dengan kulit buatan tangan. Hampir semua yang kita butuhkan ada di dapur kecuali telur dan buahnya, tetapi karena kita hidup di pertanian dan buahnya sedang musim, ini bukan masalah. masalahnya adalah oven rusak dan tidak ada cukup waktu untuk melakukan segala hal. Bukankah lebih baik memiliki lebih dari satu dari saya?

fork () untuk menyelamatkan. Sekarang ada dua dari saya. dan kami berdua menuju ke dapur untuk mulai membuat kerak pie. oops. Jadi kami melihat pengembalian dari garpu. Saya mendapat angka besar, dia mendapat nol, jadi saya menuju ke dapur sementara dia pergi ke kandang dan kebun ayam. Saat saya berjalan melewati oven saya garpu () lagi, lihat nilai kembali: payah saya mendapat nol. Dia melanjutkan ke tepung saat aku menatap oven yang pecah. Saya membuka pintu, Tidak ada cahaya, saya menutup pintu. Adakah yang tahu cara memperbaiki oven?

exec () untuk menyelamatkan. Saya meraih voltmeter pada sabuk alat saya, bohlam bisa diagnostik, jadi saya memeriksa kekuatannya, memang tersandung pemutus, perbaikan mudah. Saat saya berjalan ke panel pemutus, saya melihat seorang rekan memetik rhubarb. Huek! Saya lebih suka kue sutra cokelat.

Hildred
sumber