Apa perbedaan antara Fork dan Thread?

92

Adakah yang bisa menjelaskan perbedaan antara garpu dan utas?

Pavunkumar
sumber

Jawaban:

98

Sebuah garpu memberi Anda proses baru, yang merupakan salinan dari proses saat ini, dengan segmen kode yang sama. Saat gambar memori berubah (biasanya ini karena perilaku yang berbeda dari dua proses) Anda mendapatkan pemisahan gambar memori (Salin Saat Menulis), namun kode yang dapat dijalankan tetap sama. Tugas tidak berbagi memori kecuali mereka menggunakan beberapa primitif Inter Process Communication (IPC) .

Satu proses dapat memiliki banyak utas, masing-masing dijalankan secara paralel dalam konteks proses yang sama. Memori dan sumber daya lain dibagikan di antara utas, oleh karena itu data bersama harus diakses melalui beberapa objek primitif dan sinkronisasi (seperti mutex , variabel kondisi , dan semaphore ) yang memungkinkan Anda menghindari kerusakan data.

Dacav
sumber
3
Anda mungkin ingin merujuk ke "salinan proses saat ini" sebagai proses anak.
1
Namun segmen teks sering dibagikan (secara virtual) dan bahkan segmen data dapat disalin-saat-menulis.
Jé Queue
Jawaban: TIDAK ADA stackoverflow.com/questions/10080811/…
Michael
78

Garpu

Fork tidak lain adalah proses baru yang terlihat persis seperti proses lama atau proses induk tetapi masih merupakan proses yang berbeda dengan ID proses yang berbeda dan memiliki memori sendiri. Proses induk membuat ruang alamat terpisah untuk anak. Proses induk dan anak memiliki segmen kode yang sama, tetapi dijalankan secara independen satu sama lain.

Contoh paling sederhana dari forking adalah ketika Anda menjalankan perintah pada shell di Unix / Linux. Setiap kali pengguna mengeluarkan perintah, shell melakukan fork pada proses anak dan tugas selesai.

Ketika panggilan sistem fork dikeluarkan, salinan dari semua halaman yang sesuai dengan proses induk dibuat, dimuat ke lokasi memori terpisah oleh OS untuk proses anak, tetapi dalam kasus tertentu, ini tidak diperlukan. Seperti dalam panggilan sistem 'exec', tidak perlu menyalin halaman proses induk, karena execv menggantikan ruang alamat dari proses induk itu sendiri.

Beberapa hal yang perlu diperhatikan tentang forking adalah:

  • Proses anak akan memiliki ID proses uniknya sendiri.
  • Proses anak harus memiliki salinan deskriptor file induknya sendiri.
  • Kunci file yang disetel oleh proses induk tidak boleh diwarisi oleh proses anak.
  • Semaphore apa pun yang terbuka dalam proses induk juga harus terbuka dalam proses anak.
  • Proses anak harus memiliki salinan deskriptor antrian pesan induknya sendiri.
  • Anak akan memiliki ruang alamat dan memori sendiri.

Benang

Utas adalah Proses Berat Ringan (LWP). Secara tradisional, utas hanyalah status CPU (dan beberapa status minimal lainnya) dengan proses yang berisi sisanya (data, tumpukan, I / O, sinyal). Thread membutuhkan lebih sedikit overhead daripada "forking" atau menelurkan proses baru karena sistem tidak menginisialisasi ruang dan lingkungan memori virtual sistem baru untuk proses tersebut. Meskipun paling efektif pada sistem multiprosesor di mana aliran proses dapat dijadwalkan untuk berjalan pada prosesor lain sehingga memperoleh kecepatan melalui pemrosesan paralel atau terdistribusi, keuntungan juga ditemukan pada sistem uniprosesor yang mengeksploitasi latensi di I / O dan fungsi sistem lainnya yang dapat menghentikan proses eksekusi.

Untaian dalam proses yang sama berbagi:

  • instruksi proses
  • sebagian besar data
  • buka file (deskriptor)
  • sinyal dan penangan sinyal
  • direktori kerja saat ini
  • id pengguna dan grup

Detail selengkapnya dapat ditemukan di sini .

Napster_X
sumber
2
Suatu proses dapat memiliki beberapa utas. Jika salah satu utas dalam proses memanggil garpu, apakah proses bercabang memiliki memori yang sepenuhnya digandakan, tetapi hanya utas pemanggil yang berada dalam proses baru?
Michael
30

Jawaban Dacav sangat bagus, saya hanya ingin menambahkan bahwa tidak semua model threading memberi Anda multi-pemrosesan yang sebenarnya.

Misalnya, implementasi threading default Ruby tidak menggunakan utas OS / kernel yang sebenarnya. Sebaliknya itu meniru memiliki beberapa utas dengan beralih antara objek Thread dalam satu utas / proses kernel.

Ini penting pada sistem multiprosesor / multi-inti, karena jenis utas ringan ini hanya dapat berjalan pada satu inti - Anda tidak akan mendapatkan banyak peningkatan kinerja karena memiliki banyak utas.

Tempat lain yang membuat perbedaan ini adalah ketika satu thread memblokir (menunggu di I / O atau memanggil IOCTL driver), semua Thread memblokir.

Hal ini tidak terlalu umum saat ini - sebagian besar implementasi threading menggunakan utas kernel yang tidak mengalami masalah ini - tetapi sangat berharga untuk diperhatikan untuk kelengkapan.

Sebaliknya, fork memberi Anda proses lain yang dapat dijalankan secara bersamaan di CPU fisik lain saat proses aslinya sedang dijalankan. Beberapa orang menganggap IPC lebih cocok untuk aplikasi mereka, yang lain lebih suka threading.

Semoga berhasil dan selamat bersenang - senang! Multi-threading menantang dan bermanfaat.

Sam Post
sumber
8
+1 untuk memukul saraf: "tidak semua threading memberi Anda multiprosesing sejati"
Dacav
5

Utas adalah fungsi yang dijalankan secara paralel, garpu adalah proses baru dengan warisan orang tua. Utas bagus untuk menjalankan tugas secara paralel, sedangkan garpu adalah proses independen, yang juga berjalan secara bersamaan. Thread memiliki kondisi balapan dan ada kontrol semaphore dan lock atau mutex, pipa dapat digunakan di garpu dan thread.

sergio
sumber