जहां तक मुझे पता है कि ऑपरेटिंग सिस्टम द्वारा थ्रेड बनाए जाने पर प्रत्येक थ्रेड को एक अलग स्टैक मिलता है। मुझे आश्चर्य है कि अगर प्रत्येक धागे में खुद के लिए भी एक ढेर है?
जहां तक मुझे पता है कि ऑपरेटिंग सिस्टम द्वारा थ्रेड बनाए जाने पर प्रत्येक थ्रेड को एक अलग स्टैक मिलता है। मुझे आश्चर्य है कि अगर प्रत्येक धागे में खुद के लिए भी एक ढेर है?
जवाबों:
नहीं। सभी धागे एक साझा ढेर हैं।
प्रत्येक थ्रेड में एक निजी स्टैक होता है , जिसे वह जल्दी से आइटम जोड़ और हटा सकता है। यह स्टैक आधारित मेमोरी को तेज़ बनाता है, लेकिन यदि आप बहुत अधिक स्टैक मेमोरी का उपयोग करते हैं, जैसा कि अनंत पुनरावृत्ति में होता है, तो आपको स्टैक ओवरफ़्लो मिलेगा।
चूँकि सभी धागे समान हील को साझा करते हैं, इसलिए आवंटनकर्ता / डीलर से एक्सेस को सिंक्रनाइज़ किया जाना चाहिए। आवंटन विवाद से बचने के लिए विभिन्न तरीके और पुस्तकालय हैं ।
कुछ भाषाएं आपको मेमोरी, या व्यक्तिगत ढेर के निजी पूल बनाने की अनुमति देती हैं, जिन्हें आप एकल थ्रेड को असाइन कर सकते हैं।
you will get a stack overflow.
स्टैक ओवरफ्लो पर एक स्टैक ओवरफ्लो!
डिफ़ॉल्ट रूप से, C में केवल एक ही ढेर है।
उस ने कहा, कुछ एलोकेटर जो थ्रेड अवगत हैं, ढेर का विभाजन करेंगे ताकि प्रत्येक थ्रेड के पास खुद को आवंटित करने का क्षेत्र हो। विचार यह है कि यह ढेर पैमाने को बेहतर बनाना चाहिए।
ऐसे ढेर का एक उदाहरण होर्ड है ।
ओएस पर निर्भर करता है। खिड़कियों और यूनियनों पर मानक सी रनटाइम धागे के पार एक साझा ढेर का उपयोग करता है। इसका मतलब है हर मॉलॉक / फ्री में लॉक करना।
सिम्बियन पर, उदाहरण के लिए, प्रत्येक थ्रेड अपने स्वयं के ढेर के साथ आता है, हालांकि थ्रेड्स किसी भी ढेर में आवंटित डेटा को संकेत साझा कर सकते हैं। सिम्बियन का डिज़ाइन मेरे विचार से बेहतर है क्योंकि यह न केवल आवंटन / मुफ्त के दौरान लॉकिंग की आवश्यकता को समाप्त करता है, बल्कि थ्रेड्स के बीच डेटा स्वामित्व के स्वच्छ विनिर्देश को भी प्रोत्साहित करता है। उस मामले में भी जब एक धागा मर जाता है, तो वह अपने साथ आवंटित सभी वस्तुओं को अपने साथ ले जाता है - अर्थात यह उन वस्तुओं को लीक नहीं कर सकता है जिन्हें यह आवंटित किया गया है, जो कि एक महत्वपूर्ण संपत्ति है जिसके पास विवश स्मृति वाले मोबाइल उपकरणों में है।
एर्लैंग भी इसी तरह के डिजाइन का अनुसरण करता है जहां "प्रक्रिया" कचरा संग्रहण की एक इकाई के रूप में कार्य करती है। सभी डेटा को कॉपी करके प्रक्रियाओं के बीच संप्रेषित किया जाता है, बाइनरी ब्लॉब्स को छोड़कर जो संदर्भ में गिने जाते हैं (मुझे लगता है)।
यह इस बात पर निर्भर करता है कि "हीप" कहते समय आपका वास्तव में क्या मतलब है।
सभी थ्रेड्स पता स्थान साझा करते हैं, इसलिए ढेर-आवंटित ऑब्जेक्ट सभी थ्रेड्स से पहुंच योग्य हैं। तकनीकी रूप से, स्टैक को इस अर्थ में भी साझा किया जाता है, अर्थात कुछ भी आपको अन्य थ्रेड के स्टैक तक पहुँचने से रोकता है (हालाँकि ऐसा करने का लगभग कोई मतलब नहीं होगा)।
दूसरी ओर, स्मृति को आवंटित करने के लिए उपयोग किए जाने वाले ढेर संरचनाएं हैं । यही वह जगह है जहाँ ढेर स्मृति आवंटन के लिए सभी बहीखाते किए जाते हैं। इन संरचनाओं को थ्रेड्स के बीच विवाद को कम करने के लिए परिष्कृत रूप से व्यवस्थित किया जाता है - इसलिए कुछ धागे एक ढेर संरचना (एक अखाड़ा) साझा कर सकते हैं, और कुछ अलग-अलग एरेनास का उपयोग कर सकते हैं।
विवरणों की एक उत्कृष्ट व्याख्या के लिए निम्नलिखित सूत्र देखें: मल्टीक्रिटेड वातावरण में मॉलोक कैसे काम करता है?
आमतौर पर, थ्रेड्स ढेर और अन्य संसाधनों को साझा करते हैं, हालांकि थ्रेड जैसे निर्माण होते हैं जो नहीं करते हैं। इन थ्रेड-जैसे निर्माणों में एरलैंग की हल्की प्रक्रियाएँ हैं, और UNIX की पूर्ण-प्रक्रियाएँ (कॉल के साथ बनाई गई fork()
) हैं। आप मल्टी-मशीन कंसीडर पर भी काम कर रहे होंगे, इस स्थिति में आपके इंटर-थ्रेड कम्युनिकेशन विकल्प काफी सीमित हैं।
आम तौर पर बोलते हुए, सभी धागे एक ही पते की जगह का उपयोग करते हैं और इसलिए आमतौर पर सिर्फ एक ढेर होता है।
हालांकि, यह थोड़ा अधिक जटिल हो सकता है। आप थ्रेड लोकल स्टोरेज (TLS) की तलाश में हो सकते हैं , लेकिन यह केवल एकल मानों को संग्रहीत करता है।
Windows- विशिष्ट: TLS- स्पेस को TlsAlloc का उपयोग करके आवंटित किया जा सकता है और TlsFree ( यहाँ अवलोकन ) का उपयोग करके मुक्त किया जा सकता है । फिर, यह एक ढेर नहीं है, बस DWORD है।
अजीब तरह से, विंडोज प्रति प्रक्रिया कई हीप का समर्थन करता है। एक हील्स के हैंडल को टीएलएस में स्टोर कर सकता है। तब आपके पास "थ्रेड-लोकल हीप" जैसा कुछ होगा। हालाँकि, केवल हैंडल अन्य थ्रेड्स के लिए ज्ञात नहीं है, वे अभी भी पॉइंटर्स का उपयोग करके इसकी मेमोरी तक पहुंच सकते हैं क्योंकि यह अभी भी एक ही एड्रेस स्पेस है।
संपादित करें : कुछ मेमोरी एलोकेटर्स (विशेष रूप से फ्रीबीएसडी पर जेमलॉक ) थ्रेड्स को "एरेनास" असाइन करने के लिए टीएलएस का उपयोग करते हैं। यह सिंक्रनाइज़ेशन ओवरहेड को कम करके कई कोर के लिए आवंटन को अनुकूलित करने के लिए किया जाता है।
FreeRTOS ऑपरेटिंग सिस्टम पर, कार्य (थ्रेड्स) एक ही ढेर साझा करते हैं, लेकिन उनमें से प्रत्येक का अपना स्टैक है। कम पावर कम रैम आर्किटेक्चर के साथ काम करते समय यह बहुत काम आता है, क्योंकि मेमोरी के एक ही पूल को कई थ्रेड्स द्वारा एक्सेस / साझा किया जा सकता है, लेकिन यह एक छोटे से कैच के साथ आता है, डेवलपर को ध्यान रखना होगा कि मॉलॉक को सिंक्रनाइज़ करने के लिए एक तंत्र और मुफ्त की आवश्यकता है, यही कारण है कि ढेर पर स्मृति को आवंटित या मुक्त करने के लिए कुछ प्रकार की प्रक्रिया सिंक्रनाइज़ेशन / लॉक का उपयोग करना आवश्यक है, उदाहरण के लिए एक सेमीफोर या म्यूटेक्स।