2015-02-16 5 views
5

में एक ही प्रक्रिया के तहत थ्रेड के लिए स्टैक या मेमोरी आवंटित की जाती है सामान्य फ़ंक्शन कॉल के लिए, स्टैक फ्रेम को स्टैक में बनाया और संग्रहीत किया जाता है। लेकिन
एक प्रक्रिया के भीतर दो थ्रेड के लिए स्मृति को आवंटित किया जाता है और थ्रेड कॉल अन्य फ़ंक्शन के दौरान स्टैक फ्रेम को कैसे प्रबंधित किया जाता है।लिनक्स

+0

कोई बुरा सवाल नहीं है, लेकिन आप Google खोज द्वारा उत्तर प्राप्त कर सकते हैं। –

+0

@pranit कोठारी मैंने कोशिश की लेकिन डिन संतोषजनक उत्तर प्राप्त करें। जैसे कि हम एक धागा बनाते हैं, कैसे मुख्य थ्रेड और नया ट्रेड समान स्टैक साझा करते हैं या वे दो अलग-अलग ढेर का उपयोग करते हैं ..etc –

+1

प्रत्येक थ्रेड का अपना ढेर होता है। – user3386109

उत्तर

4

लिनक्स में वर्तमान 'थ्रेड' अवधारणा NPTL एक है। एनपीटीएल clone() का उपयोग करता है, जो sys_clone() लपेटता है। एक नए 'थ्रेड' के लिए एक ढेर आवंटित करना उपयोगकर्ता स्थान (यानी libc) में है, कर्नेल (यानि लिनक्स) में नहीं। एक पुस्तकालय पसंद के आवंटन (उदाहरण के लिए मॉलोक) का उपयोग करके एक ढेर आवंटित कर सकता है और फिर इस पते को ढेर के रूप में पास करने के लिए क्लोन() को कॉल कर सकता है (बेशक, आवंटित क्षेत्र के शीर्ष को पास करने की आवश्यकता है, क्योंकि अधिकांश ढेर नीचे गिरते हैं प्लेटफार्मों):

कांटा के विपरीत (2), क्लोन() बच्चे प्रक्रिया इस तरह के स्मृति स्थान, फ़ाइल डिस्क्रिप्टर की मेज, और की तालिका के रूप में बुला प्रक्रिया, के साथ इसके निष्पादन संदर्भ के भागों को साझा करने की अनुमति देता संकेत हैंडलर। ...

क्लोन() का मुख्य उपयोग धागे को लागू करना है: एक प्रोग्राम में नियंत्रण के कई धागे जो एक साझा स्मृति स्थान में एक साथ चलते हैं।

जब बच्चा प्रक्रिया क्लोन() के साथ बनाया गया है, यह समारोह fn (आर्ग) ...

child_stack तर्क बच्चे प्रक्रिया द्वारा उपयोग किया ढेर के स्थान निर्दिष्ट ... कार्यान्वित

यदि आप अधिक विशिष्ट विवरण जानना चाहते हैं, तो अपने distro pthread_create कार्यान्वयन का स्रोत खोलें और पढ़ना प्राप्त करें।

उदाहरण pthread_create.c के लिए:

int 
__pthread_create_2_1 (newthread, attr, start_routine, arg) 
    ... 
    struct pthread *pd = NULL; 
    int err = ALLOCATE_STACK (iattr, &pd); 
    ... 

और allocatestack.c:

# define ALLOCATE_STACK(attr, pd) allocate_stack (attr, pd, &stackaddr) 

static int 
allocate_stack (const struct pthread_attr *attr, struct pthread **pdp, 
    ALLOCATE_STACK_PARMS) 
... 

आपको लगता है कि ढेर आवंटन कुछ सीटी और घंटी, संचय करना और पुन: उपयोग ढेर क्षेत्रों, guard pages की तरह है देखेंगे, लेकिन में अंत उपयोगकर्ता स्थान में आवंटित एक स्मृति क्षेत्र है।

+0

ठीक है, इस जवाब को वैसे भी संपादित करने में सक्षम नहीं था, इसकी एनपीटीएल और एनटीपीएल नहीं। –

+0

@Uday धन्यवाद, तय –

1

जैसा कि किसी ने प्रत्येक थ्रेड पर टिप्पणी की है, यह स्वयं का ढेर है। जब उस थ्रेड से फ़ंक्शन को कॉल किया जाता है तो उस स्टैक में नया स्टैक फ्रेम बनाया जाता है।