Aplikasi Linux umumnya bercabang kemudian exec (with execve ()), tetapi aplikasi Java, dan Apache MPM tertentu menggunakan threading. Jika forking, gunakan fork + exec untuk menelurkan sebuah proses, apa versi tingkat tinggi untuk threading? Bagaimana JVM atau Worker MPM menelurkan utas?
9
Jawaban:
Gagasan di balik utas dan proses hampir sama: Anda bercabang di jalur eksekusi. Kalau tidak, utas dan proses berbeda dalam hal-hal seperti memori. Yaitu proses memiliki ruang VM yang berbeda sementara utas berbagi apa pun yang ada sebelum pemisahan.
Mendasari pekerjaan threading dan forking dengan menggunakan panggilan clone () (man 2 clone):
Perbedaan datang dari bendera yang diberikan untuk mengkloning (). Seperti yang Anda lihat dari halaman manual, fork dan threading hanyalah satu set parameter yang telah ditentukan untuk dikloning (). Namun seseorang juga dapat melakukan hal-hal khusus dengannya.
sumber
Kebanyakan sistem operasi multiprosesing non-Unix (OS) menggunakan panggilan "spawn ()" atau sesuatu yang serupa untuk menghasilkan proses OS baru atau aliran kontrol. Spawn () cenderung menjadi panggilan yang sangat kompleks, dengan banyak opsi dan banyak overhead. Salah satu inovasi Unix adalah menyediakan cara overhead yang jauh lebih rendah untuk menciptakan proses - fork (). Unix menangani banyak opsi yang diperlukan untuk menelurkan () dengan mengizinkan jumlah pemrosesan sewenang-wenang sebelum separuh lainnya bertelur (), dengan exec ().
Karena Unix dan varian-varian daripadanya semakin banyak digunakan, pembuatan proses overhead yang rendah ternyata bermanfaat, dan digunakan. Bahkan, itu digunakan begitu banyak, sehingga orang ingin cara overhead yang lebih rendah untuk membuat proses, dan ide "utas" lahir. Awalnya, utas ditangani sepenuhnya oleh proses asalnya (dan program seperti JVM dapat melakukan ini dengan "utas hijau"); tetapi menangani penjadwalan multi-thread sulit dan sering dilakukan secara tidak benar. Jadi ada cara yang lebih mudah, menengah untuk melakukan utas, di mana OS menangani penjadwalan tetapi beberapa overhead disimpan oleh (biasanya) berbagi ruang alamat antar utas.
Pertanyaan Anda sulit dijawab karena ada beberapa konsep berbeda tetapi terkait yang semuanya "utas," dan untuk detail Anda perlu kata sifat untuk menggambarkan mana yang Anda rujuk. Di sisi lain, memahami perbedaan mungkin akan mengarahkan Anda ke jawaban spesifik yang Anda inginkan. Cari hal-hal seperti "proses ringan," "utas pengguna," dan "rfork ()" untuk info lebih lanjut.
sumber
CreateProcess()
tetapi tidak ada yang serupafork()
.fork()
.Thread dan forking sebenarnya adalah dua konsep yang berbeda, keduanya ada dalam sistem Unix / Linux (dan keduanya dapat digunakan dalam C / C ++).
Gagasan fork () pada dasarnya adalah penciptaan proses terpisah yang memiliki kode eksekusi yang sama dengan proses induk, dan yang memulai eksekusi pada baris fork. Tujuan menggunakan garpu dengan fungsi exec adalah bahwa fungsi exec menutup proses yang memanggil mereka ketika mereka berakhir. Jadi, Anda biasanya bercabang, mendapatkan PID dari setiap proses (anak selalu 0), dan membuat orang tua menunggu sampai anak selesai menjalankan fungsi exec.
Thread digunakan untuk paralelisme (ingat bahwa orang tua menunggu anak, biasanya, dalam program bercabang). Utas, seperti pthread dalam C / C ++ (melakukan pencarian Google), akan berjalan secara paralel dengan proses utama, dan dapat berbagi variabel global dan fungsi global dengan program asli. Karena thread Java berperilaku serupa, saya akan membayangkan bahwa mereka bertindak lebih seperti thread ini daripada seperti proses forking.
Pada dasarnya, ada perbedaan antara forking dan threading. Mereka melakukan hal-hal yang sangat berbeda (walaupun tampak serupa). Konsep-konsep ini mungkin sulit dipahami, tetapi Anda dapat mempelajarinya melalui penelitian (luas) jika Anda memiliki keinginan yang jujur untuk memahaminya.
EDIT # 1
Silakan lihat contoh-contoh ini bagaimana garpu dan utas dapat dipanggil dan digunakan. Harap perhatikan perilaku fungsi exec dan efeknya pada program utama.
http://www.jdembrun.com:4352/computerScience/forkVSthread.zip
sumber
pthread
merupakan API, bukan implementasi utas.Baik JVM dan Apache MPM mengandalkan kernel untuk utas asli. Artinya, mereka menggunakan OS untuk menjadwalkannya. Tentu saja keduanya membutuhkan API mereka sendiri untuk melacak hal-hal.
Stackoverflow sudah memiliki beberapa pertanyaan yang berhubungan dengan ini:
JVM utas asli , lihat jawaban ini untuk lebih detail.
Apache memiliki dua jenis MPM: Prefork, dengan satu proses per utas, dan Pekerja, yang menangani beberapa utas: Apache MPM . Lihatlah referensi untuk
codebucket
sumber
Itu adalah platform khusus, tetapi di linux dan saya akan menganggap banyak sistem lain yang sesuai dengan POSIX mereka menggunakan implementasi lokal pthreads , sebuah API threading userland. Misalnya:
Mulai utas panggilan baru
somefunc
sebagai titik eksekusi pertama.Anda juga dapat membuat utas - berbeda dari garpu karena mereka berbagi ruang memori tumpukan global yang sama dari proses induk, alih-alih mendapatkan salinan duplikatnya (tetapi utas catatan masing-masing dijalankan dengan memori tumpukan independen sendiri) - dengan
clone()
panggilan sistem, yang merupakan pthreads yang dibangun di atas.sumber