क्या ढेर + ढेर + स्थिर मेमोरी मॉडल के विकल्प हैं?


9

सभी कार्यक्रमों को मैंने उनकी डेटा मेमोरी को एक या अधिक कॉल स्टैक्स (आमतौर पर निश्चित आकार, लेकिन कभी-कभी नहीं), ढेर, और स्थिर मेमोरी में व्यवस्थित करने के लिए देखा है। हाल ही में थ्रेड-लोकल स्टैटिक स्टोरेज को भी इसमें जोड़ा गया है।

क्या डेटा मेमोरी लेआउट को मौलिक रूप से अलग तरीके से व्यवस्थित करने का कोई प्रयास किया गया है, जैसे कॉल स्टैक के बिना? या स्मृति को एक अलग तरीके से व्यवस्थित करें जो एक ही चीज़ को पूरा करती है?


निर्भर करता है कि आप "स्टैक" से क्या मतलब है। आप कॉल स्टैक फ़्रेम को ढेर में रख सकते हैं (उन्हें पॉइंटर्स के साथ लिंक कर सकते हैं)। तब आपके पास स्टैक के लिए एक समर्पित रैखिक मेमोरी क्षेत्र नहीं है, लेकिन वैचारिक रूप से आपके पास अभी भी कॉल स्टैक है।

और इस बात पर निर्भर करता है कि आपका क्या मतलब है "हाल ही में"। मुझे लगता है कि थ्रेड स्थानीय भंडारण थ्रेड्स जितना पुराना है। लेकिन पहले सिस्टम कॉल के माध्यम से पहुँचा जा सकता था, जबकि अब नई भाषाएँ आपको सीधे इसके लिए पहुँच प्रदान करती हैं।
DXM

कॉल स्टैक आवश्यक है क्योंकि प्रक्रियात्मक कार्यों को यह जानने की आवश्यकता है कि उन्हें किसने बुलाया ताकि वे परिणाम वापस कर सकें और निष्पादन जारी रख सकें। वर्तमान तंत्र यदि ऐसा कर रहा है तो वास्तव में सीपीयू चक्र के संदर्भ में काफी सस्ता है और x64 के साथ कम से कम, लगभग सभी फ़ंक्शन आर्ग रजिस्टरों के माध्यम से पारित किए जाते हैं
जेम्स

2
आपको एरिक लिपर्ट का पद मिल सकता है, व्हाई ए स्टैक? ब्याज की। उनका मुख्य मुद्दा यह है कि एक स्टैक स्मृति स्थानों को ट्रैक करने के लिए एक कुशल, सरल तरीका प्रदान करता है। वह कई पुराने पदों में एक विकल्प पर चर्चा करता है, कंटीन्यूएशन पासिंग स्टाइल
ब्रायन

जवाबों:


8

आप पीछे हटना चाहते हैं और देख सकते हैं कि वे मौजूदा मॉडल कहाँ और क्यों आते हैं। जब एक प्रक्रिया बनाई जाती है, तो इसे बस एक फ्लैट स्टोरेज एरिया दिया जाता है, जिसे केवल 0 से N तक अनुक्रमित किया जाता है। क्योंकि यह स्टोरेज एरिया (रैम के बारे में बात करना) एक समर्पित हार्डवेयर द्वारा समर्थित है और कुछ फैंसी सेमीकंडक्टर्स के लिए यह बहुत तेजी से होता है, लेकिन यह अपनी तरह का अकेला नहीं है। अन्य डिवाइस जैसे कि हार्ड ड्राइव अनिवार्य रूप से एक ही चीज है, एक इंडेक्स द्वारा पता लगाने योग्य फ्लैट स्पेस, लेकिन परिमाण धीमी के कई आदेश।

"हीप" क्यों मौजूद है इसका कारण यह है कि यह प्रत्येक एप्लिकेशन के लिए स्वयं द्वारा रैम के उपयोग को प्रबंधित करने का प्रयास करने के लिए अव्यावहारिक होगा। दिन में वापस, ठीक यही है कि यह कैसे हुआ, प्रोग्रामरों ने समय से पहले योजना बनाई कि वास्तव में प्रत्येक रैम स्थान का क्या उपयोग किया जाएगा। जैसा कि सॉफ्टवेयर ने किसी को और अधिक जटिल बताया, यह अच्छा नहीं होगा यदि मैं सिर्फ कुछ ब्लैक बॉक्स में जा सकता हूं और कह सकता हूं कि "मुझे 10 बाइट्स की आवश्यकता है" तो मुझे और उन 10 बाइट्स के सभी जटिल विवरणों की चिंता नहीं करनी चाहिए से आते हैं या उन्हें कैसे पुनः प्राप्त किया जाता है। यही कारण है कि एक ढेर है, वास्तव में अधिक बुनियादी तो नहीं मिलता है कि।

हर बार जब एक धागा बनाया जाता है, तो कुछ डेटा संरचनाएं (और एक स्टैक) होती हैं, जो कि केवल वर्णित "गिम्मे ऑपरेशन" का उपयोग करके हासिल की जाती हैं। यूनिवर्सल स्टैक के बारे में सिर्फ एक स्टैक क्योंकि यह फंक्शन कॉल स्टैक फ्रेम और उनके LIFO प्रकृति के साथ पूरी तरह से फिट बैठता है। सिद्धांत रूप में, प्रत्येक फ़ंक्शन के आह्वान और स्थानीय चर को ढेर पर आवंटित किया जा सकता है, लेकिन यह बस कुछ विधानसभा निर्देशों के साथ तुलना में बहुत महंगा होगा, यह स्टैक पॉइंटर (x86 पर ESP) रजिस्टर को अपडेट करने के लिए लेता है।

थ्रेड लोकल स्टोरेज (TLS) भी ढेर के ऊपर बनाया गया है। जब एक धागा बनाया जाता है, तो प्रबंधन संरचनाओं के लिए स्मृति आवंटित करने के लिए ढेर की यात्रा के हिस्से के रूप में, टीएलएस के लिए एक अलग स्थान भी ढेर से आवंटित किया जाता है।

तो अंत में, आपके पास वास्तव में एक सामान्य मेमोरी एलोकेटर (यानी ढेर) है और बाकी सब कुछ उसके ऊपर एक विशेष रूप है। दूसरे शब्दों में, यदि आप "मैं जितना चाहता हूं (या जितना कम हो) आवंटित करना चाहता हूं, उसके कुछ पहलू को छोड़ना चाहता हूं, जब तक मैं चाहता हूं, तब तक इसे जारी रखें और जब भी मैं चाहता हूं, तब आप व्यापार से दूर हो सकते हैं।" एक और मॉडल के लिए जेनेरिक हीप एलोकेटर जो गति प्रदान करता है लेकिन कुछ अन्य सीमा की कीमत पर।

स्टैक लें। यह ढेर की तुलना में अविश्वसनीय रूप से तेज़ है, लेकिन दो ट्रेड ऑफ़ 1 हैं) जब आप मेमोरी मुक्त हो जाते हैं तो आप नियंत्रित नहीं करते हैं; इसके बजाय एक बार फ़ंक्शन से बाहर निकलने के बाद, जो भी आपने आवंटित किया है वह चला गया है और 2) क्योंकि स्टैक आमतौर पर आकार में सीमित हैं, आपको स्टैक पर सीधे बड़ी मात्रा में डेटा आवंटित करने में सावधानी बरतनी चाहिए।

एक अन्य प्रकार का "मेमोरी मॉडल" वर्चुअल मेमोरी मैनेजर (वीएमएम) है जो सिस्टम कॉल के माध्यम से हर प्रमुख ओएस के बारे में बताता है। वीएमएम एक अर्थ में ढेर के समान है जिसे आप किसी भी मात्रा में मेमोरी के लिए पूछ सकते हैं और जब तक चाहें तब तक इसे रख सकते हैं। हालाँकि, सीमा यह है कि आप केवल पृष्ठ आकार गुणकों (जैसे 4KB) में मेमोरी आवंटित कर सकते हैं, इसलिए VMM का सीधे उपयोग करने से एक विशिष्ट अनुप्रयोग में बहुत अधिक ओवरहेड हो जाता है जो अक्सर एक समय में 8-24 बाइट आवंटित करता है। वास्तव में, बस हर ढेर कार्यान्वयन के बारे में VMM के शीर्ष पर विशेष रूप से एक बहुत ही सामान्य, गैर-विशिष्ट, छोटे - आवंटन आवंटन की अनुमति देने के उद्देश्य से बनाया गया है । हीम जब भी अधिक मेमोरी की जरूरत होती है तो वीएमएम में जाती है और फिर उस मेमोरी के कई छोटे-छोटे हिस्से को एप्लिकेशन में डाल देती है।

यदि आपके पास एक ऐप है, जिसमें बड़े ब्लॉक आवंटित करने की आवश्यकता है, तो आप सीधे वीएमएम पर जाने पर विचार कर सकते हैं, हालांकि कुछ ढेरों में मॉलोक () के अंदर इफ-स्टेटमेंट है और यदि ब्लॉक का आकार कुछ सीमा से अधिक है, तो वे सीधे वीएमएम पर जाते हैं। तुम्हारे लिए।

सीधे ढेर का उपयोग करने के बजाय आवंटनकर्ताओं का एक और रूप, पूल होगा। एक पूल एक विशेष आबंटक है, जहाँ सभी ब्लॉक समान आकार के होते हैं। ताल (स्टैक और टीएलएस की तरह) ढेर या वीएमएम के शीर्ष पर बने होते हैं। ताल उन स्थानों पर उपयोगी होते हैं जहां आप एक ही आकार के छोटे-छोटे, बहुत से पिंडों (लाखों) का आवंटन करते हैं। आवक अनुरोधों को संसाधित करने वाली नेटवर्क सेवा के बारे में सोचें। प्रत्येक ग्राहक अनुरोधों के परिणामस्वरूप उस अनुरोध को संभालने के लिए उसी एन बाइट संरचना को आवंटित किया जा सकता है। पूल का उपयोग करने के साथ व्यापार बंद है कि प्रत्येक पूल केवल एक ब्लॉक आकार को संभालता है (लेकिन आप कई पूल बना सकते हैं)। पूल का लाभ यह है कि क्योंकि सभी ऑब्जेक्ट समान आकार के होते हैं, इसके लिए जटिल तर्क की आवश्यकता नहीं होती है। इसके बजाय, जब भी आपको एक नए ब्लॉक की आवश्यकता होती है, तो यह आपको वही देता है जो हाल ही में मुक्त किया गया था।

और अंत में, याद रखें कि हार्ड ड्राइव की बात मैंने ऊपर बताई थी। आपके पास एक मेमोरी मॉडल हो सकता है जो एक फाइल सिस्टम की तरह व्यवहार करता है और निर्देशिका प्रविष्टियों और आई-नोड्स के समान विचार को डुप्लिकेट करता है ताकि आप डेटा ब्लॉक के पदानुक्रमित आवंटन की अनुमति दे सकें जहां प्रत्येक डेटा ब्लॉक एक पथ के साथ संबोधित किया जाता है। ठीक यही tmpfs करता है।

मेरे द्वारा बताए गए सामान के अलावा, मुझे यकीन है कि अन्य विशिष्ट मॉडल हैं, लेकिन अंत में सब कुछ फ्लैट एड्रेस स्पेस पर आधारित है (जब तक कि कुछ उपसर्ग किसी तरह का अजीब-$ $ नॉन-फ्लैट स्पेस नहीं आता है ), यह सब उस सामान्य "जिमी" आवंटनकर्ता को वापस जाता है जो या तो वीएमएम या ढेर है।


1

केवल उन मामलों के बारे में सोच सकता हूं जो विशेष हार्डवेयर में हैं जहां आपके पास मेमोरी में निश्चित स्थानों पर चलने वाला सब कुछ हो सकता है। यदि आप पूरी तरह से लचीले कार्यक्रम चाहते हैं तो वर्तमान मेमोरी मॉडल में बहुत कुछ आवश्यक है।

स्टैक के बिना आपके पास स्थानीय वैरिएबल, कॉल स्टैक आदि नहीं हो सकते हैं। आपके द्वारा लागू करने के लिए जो कुछ भी आप लिखते हैं, वह स्टैक की तरह लग रहा है।

स्टैटिक मेमोरी और हीप आप संभावित रूप से कुछ अनुप्रयोगों के लिए ड्रॉप कर सकते हैं, लेकिन फिर से आपको कुछ और उन्नत करने के लिए उन्हें किसी न किसी रूप में वापस करने की आवश्यकता होगी।

तो इन तीनों में से एक को बदलने के लिए आप जो कुछ भी आविष्कार करते हैं, वह अंत में इन तीनों में से एक की तरह बहुत कुछ देखने वाला है ...

दूसरे कोण से इसे अप्रोच करने के लिए, जो आप जोड़ सकते हैं वह नया है? आप संभावित रूप से ग्राफिक्स / भौतिकी प्रोसेसर / सीपीयू कैश जैसी चीजों पर बहस कर सकते हैं / आदि एक नई मेमोरी लोकेशन हैं, लेकिन वास्तव में वे मौजूदा मॉडलों तक पहुंच को तेज करने का एक अलग उदाहरण हैं।

... इसलिए जब तक कोई व्यक्ति किसी तरह की विशाल वैचारिक छलांग के साथ आता है, मुझे लगता है कि हम इस क्षेत्र में लंबे समय तक कोई बड़ा बदलाव देखने की संभावना नहीं है ...


4
अधिकांश लोग यह मान लेते हैं कि वर्तमान तरीका सबसे अच्छा / एकमात्र तरीका है, और यदि एक खाली स्लेट दिया जाता है, तो वह कॉपी करता है जो पहले से मौजूद है। अन्य लोग हैं, जो वास्तव में तकनीकी प्रगति अग्रिम कर रहे हैं। यह कहने के लिए नहीं कि मुझे व्यक्तिगत रूप से किसी भी गंभीर प्रतिस्पर्धी मॉडल (जब तक आप क्वांटम कंप्यूटर की गिनती नहीं करते हैं) के बारे में पता है, लेकिन यह दावा करते हुए कि कोई भी चीज़ जो किसी के साथ आ सकती है वह वही दिखेगी जो पहले से मौजूद है, अनिवार्य रूप से परिपत्र तर्क का एक रूप है।
हारून ने

@ चेतावनी: आपके पक्ष का फ्लिप-पक्ष यह है कि अन्य लोग बॉक्स के बाहर बहुत समय, पैसा और ऊर्जा खर्च करते हैं और उनमें से प्रत्येक 1000 (शायद बहुत अधिक) के लिए, एक अंततः तकनीकी प्रगति को आगे बढ़ा सकता है, जबकि बाकी कहीं नहीं मिलता है । जबकि पहला समूह, जो कोई अधिक व्यावहारिक विचार कर सकता है, इन मौजूदा मॉडलों को इस तरह लेता है और उनमें से शीर्ष पर नवाचार करता है :)
DXM

@ARonaught मुझे लगता है कि मैंने इसे "कवर किया है" जब तक कि कोई व्यक्ति किसी तरह की विशाल वैचारिक छलांग के साथ नहीं आता है ";) यदि आपके पास एक बेहतर वैकल्पिक मॉडल है, तो यह सुझाव देने के लिए स्वतंत्र महसूस करें ... यदि ऐसा नहीं लगता है तो इसके बारे में शिकायत करने के लिए थोड़ा पाखंडी लगता है "कुछ लोग" जब आप उनमें से एक होते हैं :)
टिम बी

1
@DXM: तो? क्या मैंने कहा कि हम सभी को अपना समय नए मेमोरी मॉडल पर शोध करने में लगाना चाहिए? मैं केवल इस दावे में महत्वपूर्ण (महत्वपूर्ण) दोष को इंगित कर रहा था कि एक व्यक्ति केवल उन चीजों का आविष्कार कर सकता है जो पहले से ही आविष्कार किए गए हैं।
हारून ने

एक दावा जो मैंने कभी नहीं किया ...
टिम बी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.