प्रलेखन बहुत भ्रामक हो सकता है, इसलिए यहां " वास्तविक " लिनक्स मॉडल है:
- लिनक्स कर्नेल के अंदर, जो कुछ चलाया जा सकता है (और अनुसूचित) उसे "प्रक्रिया" कहा जाता है,
- प्रत्येक प्रक्रिया में एक सिस्टम-अद्वितीय प्रक्रिया ID (PID) और एक थ्रेड समूह ID (TGID) होती है,
- "सामान्य" प्रक्रिया में PID = TGID है और कोई अन्य प्रक्रिया इस TGID मान को साझा नहीं करती है,
- "थ्रेडेड" प्रक्रिया एक प्रक्रिया है जिसे TGID मान अन्य प्रक्रियाओं द्वारा साझा किया जाता है,
- एक ही TGID को साझा करने वाली कई प्रक्रियाएं भी साझा करती हैं, कम से कम, समान मेमोरी स्पेस और सिग्नल हैंडलर (कभी-कभी)
- यदि "थ्रेडेड" प्रक्रिया में PID = TGID है, तो इसे "मुख्य धागा" कहा जा सकता है,
getpid()
किसी भी प्रक्रिया से कॉल करने पर उसका TGID (= "मुख्य धागा" PID) वापस आ जाएगा,
gettid()
किसी भी प्रक्रिया से कॉल करने पर उसका PID (!) वापस आ जाएगा!
clone(2)
सिस्टम कॉल के साथ किसी भी तरह की प्रक्रिया बनाई जा सकती है ,
- फ़ोल्डर 'सांख्यिक नाम आप के साथ सूचीबद्ध कर सकते हैं
ls /proc
के रूप में /proc/NUMBER
TGIDs कर रहे हैं,
- PID के
/proc/TGID/task
रूप में फ़ोल्डर के संख्यात्मक नाम /proc/TGID/task/NUMBER
,
- यद्यपि आप हर मौजूदा PID को नहीं देखते हैं
ls /proc
, फिर भी आप कर सकते हैं cd /proc/any_PID
।
निष्कर्ष : कर्नेल के दृष्टिकोण से, केवल प्रक्रियाएं मौजूद हैं, प्रत्येक का अपना विशिष्ट पीआईडी है, और एक तथाकथित धागा सिर्फ एक अलग तरह की प्रक्रिया है।
नोट: लिनक्स में "थ्रेड" अवधारणा के कार्यान्वयन से एक शब्दावली भ्रम पैदा हो गया है, और यदि getpid()
आप झूठ बोल रहे हैं तो आप जो सोचते हैं वह नहीं करते हैं, यह इसलिए है क्योंकि इसका व्यवहार POSIX संगतता का अनुसरण करता है (थ्रेड्स एक आम पीआईडी साझा करने वाले हैं) ।