Linux menggunakan model threading 1-1, dengan (ke kernel) tidak ada perbedaan antara proses dan utas - semuanya hanyalah tugas yang dapat dijalankan. *
Di Linux, panggilan sistem clone
mengkloning tugas, dengan tingkat berbagi yang dapat dikonfigurasi, di antaranya adalah:
CLONE_FILES
: bagikan tabel deskriptor file yang sama (alih-alih membuat salinan)
CLONE_PARENT
: jangan mengatur hubungan orangtua-anak antara tugas baru dan yang lama (jika tidak, child getppid()
= parent's getpid()
)
CLONE_VM
: berbagi ruang memori yang sama (alih-alih membuat salinan COW )
fork()
panggilan clone(
berbagi paling sedikit )
dan pthread_create()
panggilan clone(
berbagi paling banyak )
. **
fork
Biaya sedikit lebih banyak daripada pthread_create
karena menyalin tabel dan membuat pemetaan SAP untuk memori, tetapi pengembang kernel Linux telah mencoba (dan berhasil) meminimalkan biaya-biaya tersebut.
Beralih di antara tugas, jika mereka berbagi ruang memori yang sama dan berbagai tabel, akan sedikit lebih murah daripada jika mereka tidak dibagikan, karena data mungkin sudah dimuat dalam cache. Namun, berpindah tugas masih sangat cepat walaupun tidak ada yang dibagikan - ini adalah hal lain yang coba dipastikan oleh pengembang kernel Linux (dan berhasil memastikan).
Bahkan, jika Anda menggunakan sistem multi-prosesor, tidak berbagi sebenarnya dapat bermanfaat bagi kinerja: jika setiap tugas berjalan pada prosesor yang berbeda, sinkronisasi memori bersama adalah mahal.
* Sederhana. CLONE_THREAD
menyebabkan pengiriman sinyal untuk dibagikan (yang perlu CLONE_SIGHAND
, yang berbagi tabel penangan sinyal).
** Sederhana. Ada keduanya SYS_fork
dan SYS_clone
syscalls, tetapi di kernel, sys_fork
dan sys_clone
keduanya adalah pembungkus yang sangat tipis di sekitar do_fork
fungsi yang sama , yang itu sendiri adalah pembungkus tipis di sekitar copy_process
. Ya, persyaratannya process
,, thread
dan task
digunakan secara bergantian di kernel Linux ...