2013-10-30 10 views
5

के बीच संबंध मुझे प्रोसेस आईडी और थ्रेड आईडी के बीच कुछ भ्रम है। मैं थोड़ी देर के लिए एक नया धागा शुरू कर एक ही TGID को बनाए रखते हुए आप एक नया पीआईडी ​​देता ढेर अतिप्रवाह here, जो कहते हैंथ्रेड आईडी और प्रक्रिया आईडी

एक नई प्रक्रिया आप एक नया पीआईडी ​​और एक नया TGID देता है शुरू करने सहित कई वेब-पोस्ट के माध्यम से चले गए हैं, ।

तो जब मैं एक प्रोग्राम चलाता हूं तो कार्यक्रम से बनाए गए सभी धागे में अलग-अलग पीआईडी ​​नहीं होती है?

मैं प्रोग्रामिंग में जानते हैं कि हम आम तौर पर कहना है कि मुख्य एक धागा है और निष्पादन मुख्य से शुरू होता है, तो अगर मैं मुख्य से कई धागा बनाने के लिए, सभी थ्रेड एक ही पीआईडी ​​जो मुख्य की पीआईडी ​​के बराबर है होगा।

तो क्या मैं पूछने के लिए करना चाहता था के रूप में नीचे है:

1) जब हम एक कार्यक्रम में यह एक प्रक्रिया या एक धागा के रूप में चलेंगे चला सकता हूँ?

2) क्या मुख्य थ्रेड बनाने और थ्रेड बनाने की प्रक्रिया के बीच कोई अंतर है?

3) क्या लिनक्स में थ्रेड और प्रक्रिया के बीच कोई अंतर है? चूंकि मैंने कहीं पढ़ा है कि लिनक्स थ्रेड और प्रक्रिया के बीच अंतर नहीं करता है।

+0

[अंतर-बीच-पिड-एंड-टिड] (http://stackoverflow.com/questions/4517301/difference-between-pid-and-tid) के संभावित डुप्लिकेट। – rodrigo

+0

मुझे यह नहीं लगता कि यह http://stackoverflow.com/questions/4517301/difference-between-pid-and-tid का डुप्लिकेट है। जब हम एक प्रोग्राम चलाते हैं और धागे बनाते हैं तो मैं थ्रेड और प्रोसेस आईडी के बारे में यहां पूछ रहा हूं। – neo

+1

@ मोहित :: इस [लिंक] के माध्यम से जाएं (http://stackoverflow.com/questions/19676071/understanding-pthreads), मैंने बस कुछ घंटे पहले पोस्ट किया था। –

उत्तर

1

मुझे स्टैक ओवरफ्लो पर here का उत्तर मिला। यह बताता है कि यदि हम लिनक्स पर एक प्रोग्राम चलाते हैं जिसमें libc libuClibc-0.9.30.1.so (1) शामिल है। मूल रूप से के एक पुराने संस्करण libc मैं एक linux कि तब थ्रेड (2) यानी libc के नए संस्करण ubuntu libc6 से libc शामिल के साथ इस कार्यक्रम चलाने के लिए करने की कोशिश की तो बनाया धागे के रूप में नीचे

[email protected]:~# ./test 
main thread pid is 1151 
child thread pid is 1153 

दिखाया अलग पीआईडी ​​होगा और बनाई गई प्रक्रिया के समान पीआईडी ​​होगा।

$ ./test 
main thread pid is 2609 
child thread pid is 2609 
The libc (1) use linuxthreads implementation of pthread 

और libc (2) का उपयोग NPTL ("मूल POSIX धागा पुस्तकालय") pthread

के कार्यान्वयन linuxthreads पूछे जाने वाले प्रश्न (J.3 जवाब में) के अनुसार:

प्रत्येक थ्रेड है वास्तव में एक अलग पीआईडी ​​के साथ एक अलग प्रक्रिया, और धागे के पीआईडी ​​को भेजे गए संकेतों को केवल उस थ्रेड द्वारा नियंत्रित किया जा सकता है

तो पुराना libc जो linuxthreads कार्यान्वयन का उपयोग करता है, प्रत्येक थ्रेड हेक्टेयर इसकी विशिष्ट पीआईडी ​​

नए libc संस्करण में जो NPTL कार्यान्वयन का उपयोग करता है, सभी धागे में मुख्य प्रक्रिया का एक ही पीआईडी ​​होता है।

NPTL रेडहाट टीम द्वारा विकसित किया गया था। और redhat NPTL document के अनुसार: समस्याओं जो NPTL कार्यान्वयन में हल कर रहे हैं से एक है:

(Chapter: Problems with the Existing Implementation, page5) 

Each thread having a different process ID causes compatibility problems with other POSIX thread implementations. This is in part a moot point since signals can't be used very well but is still noticeable

और वह इस मुद्दे को समझाने।

मैं नए libc संस्करण का उपयोग कर रहा हूं जिसमें NPTL ("मूल पॉजिक्स थ्रेड लाइब्रेरी") पाथ्रेड का कार्यान्वयन शामिल है।

10

थोड़ा सरल: प्रक्रिया ID

  1. पीआईडी ​​है, टीआईडी ​​धागा आईडी है। बात यह है कि fork(), पीआईडी ​​= टीआईडी ​​द्वारा बनाए गए पहले धागे के लिए। यदि आप clone() कमांड के साथ प्रक्रिया में अधिक धागे बनाते हैं, तो पीआईडी ​​और टीआईडी ​​अलग होंगे, पीआईडी ​​हमेशा टीआईडी ​​से छोटा होगा।

  2. नहीं, इसमें कोई अंतर नहीं है, सिवाय इसके कि यदि मुख्य मारे गए हैं, तो अन्य सभी धागे भी मारे गए हैं।

  3. हां, धागा वास्तव में निर्धारित होता है। तकनीकी रूप से, प्रक्रिया केवल कोड (टेक्स्ट, बीएसएस, स्टैक, हीप और ओएस) के विभिन्न हिस्सों की मेमोरी मैपिंग है।

+4

अपने 3 पर विस्तार करने के लिए। एक प्रक्रिया * मौजूद है *, एक धागा * करता है *। – Adam

+0

@ एडम: हां, यह अच्छा है, पहले कभी नहीं सुना। समानता के लिए धन्यवाद। –

+0

+1 इस बात का संदेह करने के लिए कि टीआईडी ​​और पीआईडी ​​मुख्य धागे – pRAShANT

0

आप एक ही प्रक्रिया आईडी मिल जाएगा के रूप में सभी धागे अपने कार्यक्रम डेटा जो है आपके प्रक्रिया इसलिए जब आप प्रक्रिया आईडी के लिए कॉल आप एक ही मिल बाँट रहे हैं।

1

जो पोस्ट आपने दिखाया है वह लिनक्स थ्रेडिंग कार्यान्वयन का वर्णन करता है जो मुझे लगता है कि लिनक्स कार्यान्वयन का पुराना संस्करण है जहां धागे को एक अलग प्रक्रिया के रूप में बनाया गया था। धागे के POSIX कार्यान्वयन में, धागे एक अलग प्रक्रिया के रूप में नहीं बनाए जाते हैं बल्कि वे कोड के समानांतर निष्पादन की विभिन्न धाराएं बनाते हैं जिनमें कुछ समानांतर निष्पादन में कुछ घटक भिन्न होते हैं, जिसकी जानकारी थ्रेड डिस्क्रिप्टर द्वारा संग्रहीत होती है टीआईडी। जबकि एकाधिक धागे बनाने की प्रक्रिया को बहु-थ्रेडेड प्रक्रिया के रूप में संदर्भित किया जा सकता है, इस प्रकार इसके सभी धागे का एक ही पीआईडी ​​है लेकिन अलग-अलग टीआईडी ​​है। थ्रेड बनाने वाली मुख्य प्रक्रिया को मुख्य थ्रेड

4

के रूप में संदर्भित किया जा सकता है यह भ्रम कार्यों की लिनक्स अवधारणा से आता है।

लिनक्स में हालांकि कार्य और धागे के बीच थोड़ा अंतर होता है।

प्रत्येक प्रक्रिया एक स्वयं निहित वीएम कम से कम एक कार्य चल रही है।

प्रत्येक कार्य एक प्रक्रिया दायरे के भीतर एक स्वतंत्र निष्पादन इकाई है।

प्रक्रिया का मुख्य कार्य प्रक्रिया के लिए यह कार्य आईडी (टीआईडी) देता है क्योंकि यह प्रक्रिया आईडी (पीआईडी) है।

एक नई प्रक्रिया जो आप किसी प्रक्रिया के भीतर फैलती है, उसके भीतर एक नया कार्य बनाती है। कर्नेल में अलग-अलग पहचानने के लिए उन्हें अपनी व्यक्तिगत कार्य आईडी (टीआईडी) सौंपी जाती है।

प्रक्रिया के भीतर सभी कार्य एक ही कार्य समूह आईडी (टीजीआईडी) साझा करते हैं।

+0

तो जब मैं किसी प्रक्रिया के भीतर एकाधिक धागा बना देता हूं, तो क्या सभी धागे का पिड समान या अलग होगा? – neo

+0

वे तकनीकी रूप से टीआईडी ​​हैं और वे अलग होंगे। '/ Proc/[pid]/task' जांचें। प्रक्रिया आईडी पीआईडी ​​मुख्य धागे के टीआईडी ​​के बराबर होगी और जब आप उस पीआईडी ​​को संबोधित करेंगे तो आप मुख्य धागे को संबोधित करेंगे। –

संबंधित मुद्दे