2015-03-06 8 views
5

हाल ही में, मैंने "उन्नत लिनक्स प्रोग्रामिंग" पुस्तक (http://www.advancedlinuxprogramming.com/alp-folder/alp-ch04-threads.pdf, अध्याय 4.5) में पढ़ा है कि जीएनयू/लिनक्स पॉज़िक्स धागे पर प्रक्रियाओं के रूप में लागू किया गया है और कुछ प्रकार का "प्रबंधक धागा" जो कुछ नियंत्रण काम करता है।जीएनयू/लिनक्स थ्रेड कार्यान्वयन

जब मैं इस पुस्तक से निम्न उदाहरण चलाएँ:,

#include <stdio.h> 
#include <pthread.h> 

void* thread_func(void *arg) 
{ 
    fprintf(stderr, "thread: %d\n", (int)getpid()); 
    while(1); 
    return NULL; 
} 

int main() 
{ 
    fprintf(stderr, "main: %d\n", (int)getpid()); 

    pthread_t thread; 
    pthread_create(&thread, NULL, thread_func, NULL); 

    while(1); 
    return 0; 
} 

मैं मुख्य थ्रेड और बच्चे थ्रेड के लिए एक ही पीआईडी ​​प्राप्त हो गया है, जबकि किताब में लिखा है कि यह विभिन्न & वहाँ एक और है कि हो सकता है पीआईडी, जो तथाकथित "मैनेजर थ्रेड" से मेल खाता है। मैंने इस "प्रबंधक धागे" के बारे में कुछ जानकारी खोजने की कोशिश की है, लेकिन यह मुश्किल साबित हो रहा है।

यूपीडी। मुझे अपने कार्यक्रम के बारे में कोई संदेह नहीं है, लेकिन पुस्तक पर समझाया गया है, विशेष रूप से, किस परिस्थिति में यह सच हो सकता है?

+1

क्लोन सिस्कल मैन पेज http://linux.die.net/man/2/clone – technosaurus

+2

* उन्नत लिनक्स प्रोग्रामिंग * बहुत अच्छी किताब है, लेकिन यह संभवतः [ एनपीटीएल] (http://en.wikipedia.org/wiki/Native_POSIX_Thread_Library) जो हाल ही में [glibc] (https://www.gnu.org/software/libc/) है/उपयोग करता है। –

+0

तकनीक के बारे में किताबों के साथ, हमेशा यह पता है कि पुस्तक कब प्रकाशित हुई थी, इस मामले में "प्रथम संस्करण, जून 2001"। बयान बस पुराना है। –

उत्तर

0

बस पुस्तक से संबंधित लाइनों और उदाहरण आप द्वारा साझा पढ़ना, यह स्पष्ट है कि यह POSIX threads on GNU/Linux

In GNU/Linux, threads are implemented as processes. 

इसलिए के विशिष्ट कार्यान्वयन, जब भी आप कॉल करने के लिए संबंधित है pthread_create नया धागा बनाने के लिए, लिनक्स एक नई प्रक्रिया बनाता है जो उस धागे को चलाता है।

तो उदाहरण में कोड, जब आप pthread_create(&thread, NULL, thread_func, NULL); करते हैं तो कार्यान्वयन इस नए बनाए गए धागे को चलाने के लिए एक नई प्रक्रिया बनाता है। इस प्रक्रिया में एक अलग पीआईडी ​​होगा (जो getpid() कॉल डिस्प्ले है)।

तो, अब आपके पास पहले से 2 प्रक्रिया है, एक मुख्य प्रक्रिया जिसे आप प्रोग्राम चलाते हैं और थ्रेड निष्पादन का समर्थन करने के लिए सिस्टम द्वारा बनाई गई नई प्रक्रिया को लॉन्च किया जाता है।

और वही कार्यान्वयन एक और प्रक्रिया भी बना रहा है (जो इसके कार्यान्वयन के लिए आंतरिक है), जिसे प्रबंधक धागा कहा जाता है।और यह तब बनाया जाता है जब आप pthread_create

3

मैं दोनों मुख्य थ्रेड और बच्चे धागा

है यही कारण है कि सामान्य और अपेक्षित व्यवहार के लिए एक ही पीआईडी ​​भेजी गई है। आपके द्वारा बनाए गए ये थ्रेड एक ही प्रक्रिया में सह-अस्तित्व में हैं, इसलिए getpid() उस प्रक्रिया के लिए आईडी लौटाता है। यदि आप धागे को अलग करना चाहते हैं, तो pthread_self() (POSIX- संगत, लेकिन सिस्टम-व्यापी अद्वितीय नहीं) या gettid() (लिनक्स विशिष्ट) का उपयोग करें।

आंतरिक रूप से, सभी प्रक्रियाओं और लिनक्स में धागे कार्य (और task_struct द्वारा परिभाषित) कहा जाता है सार्वभौमिक वस्तु द्वारा प्रबंधित कर रहे हैं, और प्रत्येक कार्य यह खुद आईडी है है। हालांकि, पहला कार्य एक हैंडल प्रक्रिया है जिसे इस प्रकार कार्य समूह नेता कहा जाता है। और getpid() उस कार्य समूह के नेता का पीआईडी ​​देता है।

अपने मामले में

तो, thread_func() धागा प्रिंट पीआईडी ​​अपने मुखिया के, main() कार्य, और स्वयं का main() थ्रेड प्रिंट पीआईडी।

मैं आपको कर्नेल आंतरिक में गोता लगाने का सुझाव देता हूं। यह ऐसी चीजों के क्लीनर दृश्य प्रदान करता है - उदाहरण के लिए रॉबर्ट लव बुक "लिनक्स कर्नेल डेवलपमेंट" का प्रयास करें। धागे/प्रक्रियाओं/आदि पर कुछ जानकारी। यहां पाया जा सकता है: http://www.win.tue.nl/~aeb/linux/lk/lk-10.html

+0

सवाल यह है कि कहीं और क्यों (उदाहरण के लिए, पुस्तक में वर्णित सिस्टम पर) यह सामान्य और अपेक्षित व्यवहार नहीं हो सकता है? क्या यह विशेष कर्नेल कार्यान्वयन पर निर्भर करता है? – ars

+0

मैं एक पुस्तक के लिए बात नहीं कर सका, लेकिन शायद कर्नेल के पुराने संस्करण पर उदाहरण चल रहा था? 'क्लोन() 'मैन पेज थ्रेड ग्रुप के अनुसार लिनक्स 2.4 में पेश किया गया था। – myaut

+3

@ars पुस्तक 2001 में दिनांकित है, इसलिए ऐसा लगता है कि लिनक्स, [लिनक्स थ्रेड्स] (http://en.wikipedia.org/wiki/LinuxThreads) पर pthreads के पुराने कार्यान्वयन का वर्णन किया गया है, जहां यह मामला था। – nos

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