Linux, işlemler ve iş parçacıkları arasında (çekirdeğe) hiçbir ayrım olmaksızın 1-1 iş parçacığı modeli kullanır - her şey basitçe çalıştırılabilir bir görevdir. *
Linux'ta sistem çağrısı clone
, aşağıdakiler arasında yapılandırılabilir bir paylaşım düzeyine sahip bir görevi klonlar:
CLONE_FILES
: aynı dosya tanımlayıcı tablosunu paylaşma (kopya oluşturmak yerine)
CLONE_PARENT
: yeni görev ve eski arasında bir ebeveyn-çocuk ilişkisi kurmayın (aksi takdirde çocuğun getppid()
= ebeveyninin getpid()
)
CLONE_VM
: aynı bellek alanını paylaşma ( COW kopyası oluşturmak yerine )
fork()
çağrıları clone(
az paylaşımı )
ve pthread_create()
aramaları clone(
en paylaşımı )
. **
fork
pthread_create
tabloları kopyalamak ve bellek için COW eşlemeleri oluşturmak nedeniyle maliyeti biraz daha fazladır , ancak Linux çekirdek geliştiricileri bu maliyetleri en aza indirmeyi denedi (ve başardı).
Aynı bellek alanını ve çeşitli tabloları paylaşıyorlarsa görevler arasında geçiş yapmak, veriler önceden önbelleğe yüklenebileceğinden paylaşılmadıklarından biraz daha ucuz olacaktır. Bununla birlikte, hiçbir şey paylaşılmasa bile görevleri değiştirmek çok hızlıdır - bu, Linux çekirdek geliştiricilerinin sağlamaya çalıştığı (ve sağlamayı başardığı) başka bir şeydir.
Birden çok işlemcili sistemde ise Aslında, değil paylaşım aslında performansa faydalı olabilir: Her görev farklı işlemci üzerinde çalışıyorsa, paylaşılan hafızayı senkronize pahalıdır.
* Basitleştirilmiş. CLONE_THREAD
sinyal dağıtımının paylaşılmasına neden olur (bu CLONE_SIGHAND
, sinyal işleyici tablosunu paylaşır).
** Basitleştirilmiş. Orada her ikisi de mevcut SYS_fork
ve SYS_clone
syscalls ancak çekirdek, sys_fork
ve sys_clone
aynı çevresinde hem de çok ince sargı olan do_fork
kendi etrafında ince bir sarıcı fonksiyonu copy_process
. Evet, terimler process
, thread
ve task
Linux çekirdeği yerine birbirinin yerine kullanılmaktadır ...