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.
- 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.
- Apakah konsep
fork
dan iniexec
berlaku 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? - 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.
Jawaban:
Tidak terlalu.
fork()
mengkloning proses saat ini, menciptakan anak yang identik.exec()
memuat program baru ke dalam proses saat ini, menggantikan yang sudah ada.Kebutuhannya adalah karena proses induk belum ingin mengakhiri; ia ingin proses baru berjalan dan melakukan sesuatu pada saat yang sama yang terus dijalankannya juga.
Untuk perintah eksternal, shell melakukan
fork()
sehingga perintah berjalan dalam proses baru. Builtin hanya dijalankan oleh shell secara langsung. Perintah penting lainnya adalahexec
, yang memberi tahu shell keexec()
program eksternal tanpa terlebih dahulufork()
. Ini berarti bahwa shell itu sendiri diganti dengan program baru, dan tidak ada lagi untuk program yang kembali ketika keluar. Jika Anda mengatakan,,exec true
maka/bin/true
akan mengganti shell Anda, dan segera keluar, tidak meninggalkan apa pun yang berjalan di terminal Anda lagi, jadi itu akan menutup.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.sumber
cd
atauread
bisa bekerja. Kurangnya forking juga membuat builtin jauh lebih cepat daripada perintah eksternal.execve()
untuk menindih sendiri dengan kode yang berbeda.fork()
danexec()
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 yangfork()
ada, seperti BSDvfork()
, Plan 9,rfork()
dan Linuxclone()
, tetapi prinsipal tetap sama.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.sumber
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
fork
pemanggilan 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 hanyaexec
menjadi executable lain.fork
+exec
dengan 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
vfork
itu lahir.sumber
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.
sumber