Dokümantasyon oldukça kafa karıştırıcı olabilir, bu yüzden " gerçek " Linux modeli:
- Linux çekirdeğinin içinde çalıştırılabilen (& planlanan) bir şeye "süreç" denir,
- her işlemde sisteme özgü bir İşlem Kimliği (PID) ve bir İş parçacığı Grubu Kimliği (TGID) vardır,
- "normal" bir işlemin PID = TGID'si vardır ve bu TGID değerini paylaşan başka bir işlem yoktur,
- "iş parçacıklı" bir işlem, TGID değerinin diğer işlemler tarafından paylaşıldığı bir işlemdir,
- aynı TGID'yi paylaşan birçok işlem de en azından aynı bellek alanını ve sinyal işleyicilerini (bazen daha fazla) paylaşır,
- "iş parçacığı" işleminde PID = TGID varsa, "ana iş parçacığı" olarak adlandırılabilir,
getpid()
herhangi bir işlemden çağrıldığında TGID (= "ana iş parçacığı" PID) döndürülür,
gettid()
herhangi bir işlemden çağrıldığında PID'si (!) döndürülür,
clone(2)
sistem çağrısı ile her türlü işlem oluşturulabilir ,
- TGID'ler
ls /proc
gibi listeleyebileceğiniz klasörlerin sayısal adlarını /proc/NUMBER
,
- içinde klasörler sayısal isimleri
/proc/TGID/task
olarak /proc/TGID/task/NUMBER
, PID'ler vardır
- mevcut tüm PID'leri görmemenize
ls /proc
rağmen, yine de yapabilirsiniz cd /proc/any_PID
.
Sonuç : Çekirdek bakış açısından, her biri kendi benzersiz PID'sine sahip olan yalnızca işlemler mevcuttur ve sözde bir iş parçacığı sadece farklı bir süreçtir.
Not: Linux'ta "thread" kavramının uygulanması bir kelime dağınıklığına yol açtı ve eğer getpid()
yalan söylüyorsanız düşündüğünüzü yapmazsa, bunun sebebi davranışının POSIX uyumluluğunu izlemesidir (evrelerin ortak bir PID'yi paylaşması gerekir) .